видео
Видео является очень важным источником визуальной информации, и это тип сигнала, который часто обрабатывается в процессе визуальной обработки. Фактически видео состоит из серии изображений, называемых кадрами, которые извлекаются из видео через фиксированные промежутки времени. Скорость, с которой собираются кадры, называется частотой кадров, и ее единица обычно выражается в «частоте кадров в секунду», что представляет собой количество кадров, появляющихся за 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.
После запуска эффект следующий:
захватить файл видео
Ранее мы объясняли, что если вам нужно воспроизвести видеофайлы, вам нужно только заменить камеру на имя файла.
Далее воспроизведем видеофайл, код такой:
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()
После запуска видео, отображаемое нашей камерой, становится серым. Отсюда мы также можем видеть, что при обработке видеосигналов нам нужно только получить кадр изображения каждого кадра, а затем обработать кадр.