OpenCV (38) --- класс VideoCapture для обработки видео

OpenCV
OpenCV (38) --- класс VideoCapture для обработки видео

видео

Видео является очень важным источником визуальной информации, и это тип сигнала, который часто обрабатывается в процессе визуальной обработки. Фактически видео состоит из серии изображений, называемых кадрами, которые извлекаются из видео через фиксированные промежутки времени. Скорость, с которой собираются кадры, называется частотой кадров, и ее единица обычно выражается в «частоте кадров в секунду», что представляет собой количество кадров, появляющихся за 1 секунду, что фанаты игр называют FPS.

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

Класс видеозахвата

В OpenCV он дает нам класс cv2.VideoCapture для работы с видео.

Обычно мы используем класс VideoCapture в следующих шагах:

инициализация

Класс VideoCapture предоставляет конструктор: cv2.VideoCapture(), который используется для открытия камеры и завершения ее инициализации. Его конструктор определяется следующим образом:

cv2.VideoCapture(摄像头ID号)

Значение по умолчанию для идентификационного номера камеры равно -1, что означает, что камера выбирается случайным образом. Если устройство, на котором вы запускаете программу, имеет несколько камер, используйте 0 для первой камеры устройства, 1 для второй камеры устройства и так далее. Разумеется, на общем рабочем столе камера только одна, можно использовать 0 или -1. Например, следующий код будет работать:

video=cv2.VideoCapture(0)
video=cv2.VideoCapture(-1)

Проверьте, успешно ли инициализирована камера

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

Функция для проверки успешности инициализации камеры — cv2.VideoCapture.isOpened(), и ее полное определение выглядит следующим образом:

result=cv2.VideoCapture.isOpened()

result возвращает True в случае успеха и False в случае неудачи. Когда нам не удается инициализировать камеру, мы также можем использовать функцию cv2.VideoCapture.open(), чтобы открыть камеру. Конкретный код выглядит следующим образом:

video=cv2.VideoCapture(0)
result=cv2.VideoCapture.isOpened()
if result is False:
    result=cv2.VideoCapture.open(0)

Среди них открытый параметр также является идентификационным номером камеры, который совпадает с предыдущим конструктором. В то же время, после использования функции open() для открытия камеры, она также возвращает True в случае успеха или False в случае неудачи.

Однако функция cv2.VideoCapture.open() также может напрямую открывать видеофайлы. Например:

result=cv2.VideoCapture.open(filename)

кадр захвата

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

В OpenCV функция кадра захвата, которую он нам предоставляет, — это cv2.VideoCapture.read(). Его полное определение выглядит следующим образом:

retval,image=cv2.VideoCapture.read()

Среди них retval указывает, был ли захват успешным, и возвращает логический тип. image возвращает захваченную информацию о кадре (то есть изображение). Если информация о кадре не захвачена, это значение пусто.

освобожден

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

В OpenCV он предоставляет функцию cv2.VideoCapture.release() для закрытия камеры, которая используется следующим образом:

cv2.VideoCapture.release()

Выше приведены основные шаги OpenCV по использованию камеры для захвата информации.

настройки свойств

Иногда нам нужно получить некоторые свойства камеры cv2.VideoCapture, такие как ее разрешение, пиксели и так далее. Нам нужна функция cv2.VideoCapture.get(), предоставленная нам OpenCV. Его полное определение выглядит следующим образом:

cameraInfo=cv2.VideoCapture.get(propId)

Здесь параметр propId соответствует свойству объекта класса cv2.VideoCapture. Например, получаем ширину изображения камеры, код такой:

cap=cv2.VideoCapture(0)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

Поскольку можно получить ширину, можно также получить высоту, яркость и другую информацию изображения с камеры, включая насыщенность и контрастность. Для читателей, которые хотят узнать больше, вы можете запросить документацию по разработке, которая не будет повторяться здесь.

захватить() и получить()

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

На данный момент нам нужно использовать функции cv2.VideoCapture.grab() и cv2.VideoCapture.retrieve(). Вы можете рассматривать функцию cv2.VideoCapture.read() как комбинацию этих двух функций.

Функция cv2.VideoCapture.grab() используется для указания на следующий кадр, а функция cv2.VideoCapture.retrieve() используется для декодирования и возврата кадра. Итак, для набора камер мы можем сделать так:

cap0=cv2.VideoCapture(0)
cap1=cv2.VideoCapture(0)
isCamera0=cap0.grab()
isCamera1=cap1.grab()
if isCamera0 and isCamera1:
	frame0=cap0.retrieve()
	frame1=cap1.retrieve()

Конечно, эти две функции также могут читать видеофайлы.

Захват видео с веб-камеры

Теперь, когда мы увидели класс VideoCapture. Далее займемся видео с камеры компьютера. Его полный код выглядит следующим образом:

import cv2

cap=cv2.VideoCapture(0)
while(cap.isOpened()):
    ret,frame=cap.read()
    cv2.imshow('video',frame)
    c=cv2.waitKey(1)
    if c==27:
        break
cap.release()
cv2.destroyAllWindows()

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

После запуска эффект следующий:

视频1

захватить файл видео

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

Далее воспроизведем видеофайл, код такой:

import cv2

cap=cv2.VideoCapture("38.mp4")
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
while(cap.isOpened()):
    ret,frame=cap.read()
    cv2.imshow('video',frame)
    c=cv2.waitKey(1)
    if c==27:
        break
cap.release()
cv2.destroyAllWindows()

Здесь он не запустится.Если вам интересно, вы можете заменить видео "38.MP4" на свое.

Реализация камеры в оттенках серого

Из приведенных выше двух примеров мы знаем, как использовать камеру. Однако в целом, когда мы пользуемся мобильными телефонами, появляются различные спецэффекты, такие как красота, черно-белые и другие эффекты. Итак, как мы достигаем этих эффектов?

Ниже мы берем изображение в градациях серого в качестве примера, чтобы собрать видео, записанное камерой, в виде изображения в градациях серого. Конкретный код выглядит следующим образом:

import cv2

cap=cv2.VideoCapture(0)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
while(cap.isOpened()):
    ret,frame=cap.read()
    frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    cv2.imshow('video',frame)
    c=cv2.waitKey(1)
    if c==27:
        break
cap.release()
cv2.destroyAllWindows()

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

灰度录制