Cv2.VideoCapture: примеры (PYTHON)

Использование cv2.VideoCapture для захвата видео в Python
Раздел: OpenCV, Видео
cv2.VideoCapture(source: str/int): VideoCapture object

Описание функции cv2.VideoCapture

Функция cv2.VideoCapture является частью библиотеки OpenCV для Python и создает объект для захвата видео. Этот объект позволяет получать кадры из видеофайлов, последовательностей изображений или устройств видеозахвата, таких как веб-камеры. Использование функции распространено в задачах компьютерного зрения, включая обработку видео, анализ движения и создание систем машинного зрения.

Конструктор класса имеет следующую сигнатуру: cv2.VideoCapture(filename, apiPreference) или cv2.VideoCapture(index, apiPreference).

  • Параметр filename принимает строку с путем к видеофайлу (например, 'video.avi') или к последовательности изображений (например, 'img_%02d.jpg').
  • Параметр index является целым числом, указывающим индекс камеры. Обычно 0 для встроенной камеры.
  • Параметр apiPreference представляет собой флаг, определяющий бэкенд для захвата видео. Примеры флагов: cv2.CAP_ANY, cv2.CAP_DSHOW, cv2.CAP_V4L2.

Метод возвращает объект VideoCapture. Успешное создание объекта не гарантирует доступ к видеопотоку. Для проверки доступности используют метод isOpened(). Для чтения кадров применяют метод read(), возвращающий кортеж из логического значения и кадра. Логическое значение указывает на успешность чтения.

Короткие примеры использования cv2.VideoCapture

Пример захвата видео с веб-камеры.

import cv2
cap = cv2.VideoCapture(0)
if cap.isOpened():
    ret, frame = cap.read()
    if ret:
        print('Кадр считан')
    cap.release()
Кадр считан

Пример открытия видеофайла.

import cv2
cap = cv2.VideoCapture('input_video.mp4')
print(cap.isOpened())
True

Пример указания API предпочтения.

import cv2
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
640.0

Похожие функции в Python

Для работы с видео в Python существуют альтернативные библиотеки. Библиотека imageio предоставляет функцию get_reader, которая позволяет читать видеофайлы. Этот способ проще для базового чтения кадров, но предлагает меньше контроля над параметрами по сравнению с OpenCV.

Библиотека moviepy использует класс VideoFileClip для редактирования видео. Она удобна для монтажа и применения эффектов, но может быть менее эффективной для обработки в реальном времени.

Библиотека PyAV является оберткой для FFmpeg и предоставляет низкоуровневый контроль над видеопотоками. Она подходит для сложных задач, таких как работа с кодеками, но имеет более высокий порог входа.

Альтернативы в других языках программирования

В JavaScript библиотека OpenCV.js предоставляет аналогичный функционал через класс VideoCapture. Однако работа с видеопотоком часто осуществляется через API браузера, например, с помощью элемента video.

// Использование OpenCV.js
let cap = new cv.VideoCapture('video.mp4');
let frame = new cv.Mat();
cap.read(frame);

В Java используется библиотека OpenCV с классом VideoCapture. Сигнатура методов похожа на Python версию.

import org.opencv.videoio.VideoCapture;
VideoCapture cap = new VideoCapture(0);
Mat frame = new Mat();
cap.read(frame);

В C# с использованием Emgu.CV (обертка для OpenCV) класс VideoCapture также доступен.

using Emgu.CV;
VideoCapture cap = new VideoCapture(0);
Mat frame = new Mat();
cap.Read(frame);

В языках, таких как PHP или SQL, прямая обработка видео обычно не осуществляется, и используются внешние сервисы или вызовы к другим программам.

Типичные ошибки при использовании

Одна из распространенных ошибок - отсутствие проверки успешности открытия видеопотока.

import cv2
cap = cv2.VideoCapture('несуществующий_файл.mp4')
ret, frame = cap.read()  # ret будет False, frame - None
if not ret:
    print('Не удалось прочитать кадр')
Не удалось прочитать кадр

Другая ошибка - забыть освободить захват, что может привести к утечке ресурсов.

import cv2
cap = cv2.VideoCapture(0)
# ... работа с кадром
# Забыли вызвать cap.release()

Попытка получить кадр после вызова release() вызывает ошибку.

import cv2
cap = cv2.VideoCapture(0)
cap.release()
ret, frame = cap.read()  # Возможна ошибка

Изменения в последних версиях

В OpenCV версии 4.x были добавлены новые бэкенды для захвата видео через параметр apiPreference. Например, поддержка cv2.CAP_ANY позволяет библиотеке автоматически выбирать бэкенд. Также улучшена работа с камерами, поддерживающими высокие разрешения и частоты кадров.

Были обновлены внутренние механизмы обработки видеопотоков, что повысило стабильность при чтении из различных источников. Однако основные методы, такие как read() и isOpened(), остаются без изменений для обеспечения обратной совместимости.

Расширенные примеры использования

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

Пример python
import cv2
cap = cv2.VideoCapture('input.mp4')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480), False)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    out.write(gray)
cap.release()
out.release()

Пример использования с последовательностью изображений.

Пример python
import cv2
cap = cv2.VideoCapture('img_%02d.jpg')  # Читает img_00.jpg, img_01.jpg и т.д.
while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('Sequence', frame)
    if cv2.waitKey(100) & 0xFF == ord('q'):
        break
cap.release()

Пример установки свойств видеопотока, таких как ширина и высота.

Пример python
import cv2
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
print(f'Ширина: {cap.get(cv2.CAP_PROP_FRAME_WIDTH)}')
print(f'Высота: {cap.get(cv2.CAP_PROP_FRAME_HEIGHT)}')
cap.release()
Ширина: 1280.0
Высота: 720.0

питон cv2.VideoCapture function comments

En
Cv2.VideoCapture Open video file or camera