Прежде всего, необходимо прояснить фундаментальный вопрос. OpenCV — это кроссплатформенная библиотека программного обеспечения для компьютерного зрения и машинного обучения, выпущенная под лицензией Apache2.0 (с открытым исходным кодом). Фактически это централизованная библиотека различных алгоритмов общего назначения в области обработки изображений и компьютерного зрения.
Короче говоря: обрабатывайте изображения.
Обычно используют OpenCV Приходитьруководить РазличныйОбработка изображенийивычислить。Так что это невидео Библиотека кодеков。Даже не думайте использовать его OpenCV для воспроизведения видео
Все видео, воспроизводимые с помощью OpenCV, фактически конвертируют видео в изображения, а затем переключают и отображают изображения одно за другим. Эффективность кодирования и декодирования гораздо менее эффективна, чем у специального видеоплеера.
Если вы хотите воспроизводить видео, все равно рекомендуется использовать FFmpeg.
Мы можем использовать OpenCV для декодирования видео в файл Mat, выполнения операций и сохранения отредактированного результата в виде видео.
Результаты, снятые камерой, могут быть обработаны в режиме реального времени. Сохранение как видео и другие операции.
И используйтеизто естьVideoWriter
и VideoCapture
Сорт。
Следующий контент основан на: OpenCV 4.6.0 ВерсияAPIруководитьизпредставлятьииспользовать。
Класс для захвата видео из видеофайла, последовательности изображений или камеры. Этот класс предоставляет различные методы захвата видео.
Предусмотрено несколько методов:
1. Получите каждый кадр данных и преобразуйте его в Mat.
2. Получите некоторую информацию о конфигурации видео, такую как продолжительность, частота кадров, количество кадров, ширина и высота и т. д.
Инициализация выглядит следующим образом:
VideoCapture videoCapture = new VideoCapture(); //Создаем объект VideoCapture
Фактически, мы также можем инициализировать и передавать параметры в процессе создания. Параметры, передаваемые при инициализации этих конструкций, и параметры, передаваемые при вызове open(), на самом деле одинаковы.
PS: При использовании метода OpenCV обратите внимание, что вам необходимо заранее инициализировать и загрузить библиотеку OpenCV. В противном случае соответствующий класс не будет найден и произойдет сбой.
OpenCVLoader.initDebug(false);//нагрузкаOpenCVБиблиотека
Далее не имеет значения, загружается ли камера или сетевой адрес. На стороне Android у меня не было успеха. Успешно загрузились только локальные видео.
Загрузка камеры должна быть Android Причина в том, что он не поддерживается сам по себе. Пробовал разные cameraId Ценность и связанные с ней apiPreference Все провалилось. (Мы можем использовать CameraXнагрузка камеры и обработка ихранилище)
По моим оценкам, сбой при загрузке онлайн-видео вызван тем, что в Android SDK, скомпилированном openCV по умолчанию, нет соответствующих зависимостей.
(Если это вызвано отсутствием зависимых библиотек, я надеюсь, что кто-нибудь из понимающих сможет дать мне совет. Все мои попытки потерпели неудачу).
boolean isOpen = videoCapture.open("/storage/emulated/0/Android/data/com.zinyan.demo/files/demo.mp4", Videoio.CAP_ANDROID); //нагрузкаместныйвидео boolean isOpen = videoCapture.open(0); //нагрузка камеры
boolean isOpen = videoCapture.open("https://host:port/script_name?script_params|auth",Videoio.CAP_ANDROID); //нагрузкасетьвидео。
Открытый метод передает в основном следующие параметры:
Videoio.CAP_ANY
,Videoio.CAP_DSHOW
,Videoio.CAP_ANDROID
ждать.VideoCapture
входящийизapiPrefreence
из Список дополнительных параметров выглядит следующим образом::
// C++: enum VideoCaptureAPIs
public static final int
CAP_ANY = 0,
CAP_VFW = 200,
CAP_V4L = 200,
CAP_V4L2 = CAP_V4L,
CAP_FIREWIRE = 300,
CAP_FIREWARE = CAP_FIREWIRE,
CAP_IEEE1394 = CAP_FIREWIRE,
CAP_DC1394 = CAP_FIREWIRE,
CAP_CMU1394 = CAP_FIREWIRE,
CAP_QT = 500,
CAP_UNICAP = 600,
CAP_DSHOW = 700,
CAP_PVAPI = 800,
CAP_OPENNI = 900,
CAP_OPENNI_ASUS = 910,
CAP_ANDROID = 1000,
CAP_XIAPI = 1100,
CAP_AVFOUNDATION = 1200,
CAP_GIGANETIX = 1300,
CAP_MSMF = 1400,
CAP_WINRT = 1410,
CAP_INTELPERC = 1500,
CAP_REALSENSE = 1500,
CAP_OPENNI2 = 1600,
CAP_OPENNI2_ASUS = 1610,
CAP_GPHOTO2 = 1700,
CAP_GSTREAMER = 1800,
CAP_FFMPEG = 1900,
CAP_IMAGES = 2000,
CAP_ARAVIS = 2100,
CAP_OPENCV_MJPEG = 2200,
CAP_INTEL_MFX = 2300,
CAP_XINE = 2400;
вызовopen()
методназад,Если загрузка прошла успешно, она вернет true,Возвращает false в случае неудачи.
Потому что я только что загрузил локальное видео, и оно успешно загрузилось. Поэтому следующее введение также основано на этом успехе.
На стороне Android, если вы хотите иметь возможность правильно открывать видео и анализировать его. Значения apiPrefreence только:
Videoio.CAP_ANY
или Videoio.CAP_ANDROID
быть правильнымнагрузкавидео
Возвращенное значение isOpen истинно. Примеры следующие:
boolean isOpen = videoCapture.open(fileUrl, Videoio.CAP_ANY);
boolean isOpen = videoCapture.open(fileUrl, Videoio.CAP_ANDROID);
Я попытался использовать CAP_FFMPEG в качестве значения для загрузки.
boolean isOpen = videoCapture.open(fileUrl, Videoio.CAP_FFMPEG);
//Вывод ошибки следующий:
com.zinyan.demo E/cv::error(): OpenCV(4.6.0) Error: Requested object was not found (could not open directory: /data/app/com.zinyan.demo-Wr3nLeu2TTtG12e53ogTGw==/base.apk!/lib/arm64-v8a) in glob_rec, file /build/master_pack-android/opencv/modules/core/src/glob.cpp, line 267
Должен быть SDK OpenCV Android по умолчанию. Библиотеки, связанной с FFmpeg, нет.
Поэтому я хочу пройтиhttpsилиrtspждатьпротоколнагрузкаонлайнвидеотоже не удалось。Причина в томopenCV Предварительно скомпилированный Android Сторонних проектов в SDK не так уж и много. Возможно, нам нужно настроить его самостоятельно.
PS: Самостоятельная настройка и компиляция немного громоздки. Я тоже не пробовал.
После того, как мы успешно загрузим видео. Вы можете выполнять операции синтаксического анализа.
Эти три метода в основном используются для получения данных каждого кадра видео и преобразования данных кадра в объекты Mat.
Обратите внимание, что получаемые ими объекты Mat имеют формат BGR.
Например: получить текущий кадр:
Mat m = new Mat();
videoCapture.read(m);
//Мы можем получить текущий кадр.
//Официально не рекомендуем напрямую получать объект изMat. Мы можем скопировать Из и затем оперировать Mat
Mat temp =m.clone()
Кроме того, существуют следующие методы получения текущего кадра:
boolean isFrame =videoCapture.grab(); // Захват следующего кадра из видеофайла или устройства захвата. True, если захват успешен, в противном случае — false.
Mat tt =new Mat();
boolean isRetrieve =videoCapture.retrieve(tt); //Декодируем и возвращаем захваченный кадр извидео. Возвращает false, если нет кадров.
на самом делеread()
даgrab()
+retrieve()
методиз Коллекция。
grab()
метод Толькода Обнаружениевидеорамка,Не буду анализировать видеокадр. Так это быстрее.
retrieve()
методвстречаруководитьвидеорамкаизанализировать。буду сравниватьgrab()
методбольше времени。эти двоеметодобычнода Вместеиспользоватьиз。
но,большинство случаев Вниз Вседаиспользоватьread()
+цикл,Пройти всё видеоиз всех кадров,И осуществить иметь дело с.
while (videoCapture.read(mat)) {
Mat m = new Mat();
Imgproc.cvtColor(mat, m, Imgproc.COLOR_BGR2HSV_FULL);
}
read()
:методвозвращатьсяизfalseчас,Это означает, что следующего кадра нет. То есть анализировать до последнего кадра.
Благодаря зацикливанию каждый кадр данных в видео можно быстро проанализировать и преобразовать в Mat для обработки.
Обратите внимание, что Видео Капчер звоню
read()
получатьвидеорамка Изназад。Всегдаполучатьдо концаназад Изназад。不встреча回到第一рамкаполучать。我们Только能重新вызовopen()
методснованагрузка Только тогда。
Помимо прохождениявидеорамкаданныекроме。Вы также можете пройтиget()
методполучатьвидеоиз Сопутствующая информация。
Примеры следующие:
double ftp = videoCapture.get(Videoio.CAP_PROP_FPS);
double width = videoCapture.get(Videoio.CAP_PROP_FRAME_WIDTH);
double count = videoCapture.get(Videoio.CAP_PROP_FRAME_COUNT);
double htight = videoCapture.get(Videoio.CAP_PROP_FRAME_HEIGHT);
Этот метод должен передать значение propId. Параметры значения этого значения следующие:
Videoio.CAP_PROP_POS_MSEC = 0,
Videoio.CAP_PROP_POS_FRAMES = 1,
Videoio.CAP_PROP_POS_AVI_RATIO = 2,
Videoio.CAP_PROP_FRAME_WIDTH = 3,
Videoio.CAP_PROP_FRAME_HEIGHT = 4,
Videoio.CAP_PROP_FPS = 5,
Videoio.CAP_PROP_FOURCC = 6,
Videoio.CAP_PROP_FRAME_COUNT = 7,
Videoio.CAP_PROP_FORMAT = 8,
Videoio.CAP_PROP_MODE = 9,
Videoio.CAP_PROP_BRIGHTNESS = 10,
Videoio.CAP_PROP_CONTRAST = 11,
Videoio.CAP_PROP_SATURATION = 12,
Videoio.CAP_PROP_HUE = 13,
Videoio.CAP_PROP_GAIN = 14,
Videoio.CAP_PROP_EXPOSURE = 15,
Videoio.CAP_PROP_CONVERT_RGB = 16,
Videoio.CAP_PROP_WHITE_BALANCE_BLUE_U = 17,
Videoio.CAP_PROP_RECTIFICATION = 18,
Videoio.CAP_PROP_MONOCHROME = 19,
Videoio.CAP_PROP_SHARPNESS = 20,
Videoio.CAP_PROP_AUTO_EXPOSURE = 21,
Videoio.CAP_PROP_GAMMA = 22,
Videoio.CAP_PROP_TEMPERATURE = 23,
Videoio.CAP_PROP_TRIGGER = 24,
Videoio.CAP_PROP_TRIGGER_DELAY = 25,
Videoio.CAP_PROP_WHITE_BALANCE_RED_V = 26,
Videoio.CAP_PROP_ZOOM = 27,
Videoio.CAP_PROP_FOCUS = 28,
Videoio.CAP_PROP_GUID = 29,
Videoio.CAP_PROP_ISO_SPEED = 30,
Videoio.CAP_PROP_BACKLIGHT = 32,
Videoio.CAP_PROP_PAN = 33,
Videoio.CAP_PROP_TILT = 34,
Videoio.CAP_PROP_ROLL = 35,
Videoio.CAP_PROP_IRIS = 36,
Videoio.CAP_PROP_SETTINGS = 37,
Videoio.CAP_PROP_BUFFERSIZE = 38,
Videoio.CAP_PROP_AUTOFOCUS = 39,
Videoio.CAP_PROP_SAR_NUM = 40,
Videoio.CAP_PROP_SAR_DEN = 41,
Videoio.CAP_PROP_BACKEND = 42,
Videoio.CAP_PROP_CHANNEL = 43,
Videoio.CAP_PROP_AUTO_WB = 44,
Videoio.CAP_PROP_WB_TEMPERATURE = 45,
Videoio.CAP_PROP_CODEC_PIXEL_FORMAT = 46,
Videoio.CAP_PROP_BITRATE = 47;
Однако во многих случаях, когда мы используем приведенные выше ключевые слова для получения данных, значение результата равно 0.
Это связано с тем, что анализатор, используемый openCV, вернет конкретную ссылку, если он правильно получит соответствующие параметры элемента конфигурации при получении видео. Если оно получено неправильно, будет возвращено 0.
В моем реальном процессе использования большую часть реальных данных получить невозможно. Такие данные, как ширина и высота, невозможно получить, пока не будет прочитан один кадр данных.
videoCapture.set(int propId, double value)
иset()
метод,Просто передайте эту информацию о конфигурации в середину VideoCapture.
если вopen()
методсерединавызовиз Поддержка кодековизразговаривать。Вы можете добавить эту информацию о конфигурации в декодер.середина.руководить Эффективный。
Если мы просто позвоним openCV из API。Такset()
методиспользовать Осталось не так много места。
Когда мы закончили обход,Можетвызовrelease()
метод закрытие файла изнагрузка. Освободите память.
В то же время будут также выпущены связанные файлы в базовом коде C++.
В общем,我们МожетиспользоватьVideoCapture
руководитьвидеорамкаиз Траверс,И выполнять операции редактирования Исправлять каждый кадр в процессе обхода.
Если мы хотим использовать openCV после работы Из в каждом кадре,Сновахранилищедлявидео。Так Это еще надо совместитьVideoWriter
для хранения.
По умолчанию под Android,Можно получить видео из каждого кадра,И затем исправлять хранилище для нового файла извидео.
С помощью этих методов можно добиться,Например, к видео добавить водяной знак,замена фона,Черно-белое преобразование и так далее. Изображения могут выполнять некоторые операции редактирования, получая каждый кадр.,После обработки. Затем для достижения этой цели преобразуйте каждое хранилище кадров в видео.
Документация официального сайта openCV:
https://docs.opencv.org/4.6.0/d4/d15/groupvideoioflags__base.html#ga023786be1ee68a9105bf2e48c700294d
Следующая статья простапредставлять ВнизVideoWriter
из Связанныйиспользовать Бар。