Класс OpenCV Android VideoCapture
Класс OpenCV Android VideoCapture

1. Введение

Прежде всего, необходимо прояснить фундаментальный вопрос. OpenCV — это кроссплатформенная библиотека программного обеспечения для компьютерного зрения и машинного обучения, выпущенная под лицензией Apache2.0 (с открытым исходным кодом). Фактически это централизованная библиотека различных алгоритмов общего назначения в области обработки изображений и компьютерного зрения.

Короче говоря: обрабатывайте изображения.

Обычно используют OpenCV Приходитьруководить РазличныйОбработка изображенийивычислить。Так что это невидео Библиотека кодеков。Даже не думайте использовать его OpenCV для воспроизведения видео

Все видео, воспроизводимые с помощью OpenCV, фактически конвертируют видео в изображения, а затем переключают и отображают изображения одно за другим. Эффективность кодирования и декодирования гораздо менее эффективна, чем у специального видеоплеера.

Если вы хотите воспроизводить видео, все равно рекомендуется использовать FFmpeg.

Мы можем использовать OpenCV для декодирования видео в файл Mat, выполнения операций и сохранения отредактированного результата в виде видео.

Результаты, снятые камерой, могут быть обработаны в режиме реального времени. Сохранение как видео и другие операции.

И используйтеизто естьVideoWriter и VideoCaptureСорт。

Следующий контент основан на: OpenCV 4.6.0 ВерсияAPIруководитьизпредставлятьииспользовать。

2. VideoCapture

Класс для захвата видео из видеофайла, последовательности изображений или камеры. Этот класс предоставляет различные методы захвата видео.

Предусмотрено несколько методов:

1. Получите каждый кадр данных и преобразуйте его в Mat.

2. Получите некоторую информацию о конфигурации видео, такую ​​​​как продолжительность, частота кадров, количество кадров, ширина и высота и т. д.

Инициализация выглядит следующим образом:

Язык кода:javascript
копировать
 VideoCapture videoCapture = new VideoCapture(); //Создаем объект VideoCapture

Фактически, мы также можем инициализировать и передавать параметры в процессе создания. Параметры, передаваемые при инициализации этих конструкций, и параметры, передаваемые при вызове open(), на самом деле одинаковы.

PS: При использовании метода OpenCV обратите внимание, что вам необходимо заранее инициализировать и загрузить библиотеку OpenCV. В противном случае соответствующий класс не будет найден и произойдет сбой.

Язык кода:javascript
копировать
OpenCVLoader.initDebug(false);//нагрузкаOpenCVБиблиотека

2.1 Загрузка метода open()

Далее не имеет значения, загружается ли камера или сетевой адрес. На стороне Android у меня не было успеха. Успешно загрузились только локальные видео.

Загрузка камеры должна быть Android Причина в том, что он не поддерживается сам по себе. Пробовал разные cameraId Ценность и связанные с ней apiPreference Все провалилось. (Мы можем использовать CameraXнагрузка камеры и обработка ихранилище)

По моим оценкам, сбой при загрузке онлайн-видео вызван тем, что в Android SDK, скомпилированном openCV по умолчанию, нет соответствующих зависимостей.

(Если это вызвано отсутствием зависимых библиотек, я надеюсь, что кто-нибудь из понимающих сможет дать мне совет. Все мои попытки потерпели неудачу).

Язык кода:javascript
копировать
 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); //нагрузкасетьвидео。

Открытый метод передает в основном следующие параметры:

  • Строковое имя файла: адрес файла, который может быть URL-адресом или адресом локального документа.
  • int index: идентификатор камеры, если 0, будет вызвана задняя камера устройства по умолчанию.
  • int apiPreference: apiПредпочтения。Этот параметр:Videoio.CAP_ANY,Videoio.CAP_DSHOW,Videoio.CAP_ANDROIDждать.

VideoCapture входящийизapiPrefreenceиз Список дополнительных параметров выглядит следующим образом::

Язык кода:javascript
копировать
 // 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 истинно. Примеры следующие:

Язык кода:javascript
копировать
boolean isOpen = videoCapture.open(fileUrl, Videoio.CAP_ANY); 

boolean isOpen = videoCapture.open(fileUrl, Videoio.CAP_ANDROID);

Я попытался использовать CAP_FFMPEG в качестве значения для загрузки.

Язык кода:javascript
копировать
 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: Самостоятельная настройка и компиляция немного громоздки. Я тоже не пробовал.

После того, как мы успешно загрузим видео. Вы можете выполнять операции синтаксического анализа.

2.2 Анализ методов read(), Grab() и Reget()

Эти три метода в основном используются для получения данных каждого кадра видео и преобразования данных кадра в объекты Mat.

Обратите внимание, что получаемые ими объекты Mat имеют формат BGR.

Например: получить текущий кадр:

Язык кода:javascript
копировать
Mat m = new Mat();
videoCapture.read(m);
//Мы можем получить текущий кадр.
//Официально не рекомендуем напрямую получать объект изMat. Мы можем скопировать Из и затем оперировать Mat
Mat temp =m.clone()

Кроме того, существуют следующие методы получения текущего кадра:

Язык кода:javascript
копировать
boolean isFrame =videoCapture.grab(); // Захват следующего кадра из видеофайла или устройства захвата. True, если захват успешен, в противном случае — false.
Mat tt =new Mat();
boolean isRetrieve =videoCapture.retrieve(tt); //Декодируем и возвращаем захваченный кадр извидео. Возвращает false, если нет кадров.

на самом делеread() даgrab()+retrieve()методиз Коллекция。

grab()метод Толькода Обнаружениевидеорамка,Не буду анализировать видеокадр. Так это быстрее.

retrieve()методвстречаруководитьвидеорамкаизанализировать。буду сравниватьgrab()методбольше времени。эти двоеметодобычнода Вместеиспользоватьиз。

но,большинство случаев Вниз Вседаиспользоватьread()+цикл,Пройти всё видеоиз всех кадров,И осуществить иметь дело с.

Язык кода:javascript
копировать
 while (videoCapture.read(mat)) {
    Mat m = new Mat();
    Imgproc.cvtColor(mat, m, Imgproc.COLOR_BGR2HSV_FULL);
}

read():методвозвращатьсяизfalseчас,Это означает, что следующего кадра нет. То есть анализировать до последнего кадра.

Благодаря зацикливанию каждый кадр данных в видео можно быстро проанализировать и преобразовать в Mat для обработки.

Обратите внимание, что Видео Капчер звоню read() получатьвидеорамка Изназад。Всегдаполучатьдо концаназад Изназад。不встреча回到第一рамкаполучать。我们Только能重新вызовopen()методснованагрузка Только тогда。

2.3 Измените методы set() и get().

Помимо прохождениявидеорамкаданныекроме。Вы также можете пройтиget()методполучатьвидеоиз Сопутствующая информация。

Примеры следующие:

Язык кода:javascript
копировать
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. Параметры значения этого значения следующие:

Язык кода:javascript
копировать
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.

В моем реальном процессе использования большую часть реальных данных получить невозможно. Такие данные, как ширина и высота, невозможно получить, пока не будет прочитан один кадр данных.

Язык кода:javascript
копировать
videoCapture.set(int propId, double value)

иset()метод,Просто передайте эту информацию о конфигурации в середину VideoCapture.

если вopen()методсерединавызовиз Поддержка кодековизразговаривать。Вы можете добавить эту информацию о конфигурации в декодер.середина.руководить Эффективный。

Если мы просто позвоним openCV из API。Такset()методиспользовать Осталось не так много места。

2.4 Закрыть выпуск()

Когда мы закончили обход,Можетвызовrelease()метод закрытие файла изнагрузка. Освободите память.

В то же время будут также выпущены связанные файлы в базовом коде C++.

3. Резюме

В общем,我们МожетиспользоватьVideoCaptureруководитьвидеорамкаиз Траверс,И выполнять операции редактирования Исправлять каждый кадр в процессе обхода.

Если мы хотим использовать openCV после работы Из в каждом кадре,Сновахранилищедлявидео。Так Это еще надо совместитьVideoWriter для хранения.

По умолчанию под Android,Можно получить видео из каждого кадра,И затем исправлять хранилище для нового файла извидео.

С помощью этих методов можно добиться,Например, к видео добавить водяной знак,замена фона,Черно-белое преобразование и так далее. Изображения могут выполнять некоторые операции редактирования, получая каждый кадр.,После обработки. Затем для достижения этой цели преобразуйте каждое хранилище кадров в видео.

Документация официального сайта openCV:

https://docs.opencv.org/4.6.0/d4/d15/groupvideoioflags__base.html#ga023786be1ee68a9105bf2e48c700294d

Следующая статья простапредставлять ВнизVideoWriterиз Связанныйиспользовать Бар。

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose