Как открыть видео в OpenCV с помощью Python?

Начнем с истоков. Что такое видео? Видео представляет собой последовательность изображений или кадров, которые непрерывно следуют друг за другом. Число изображений, которые успевают смениться в течение одной секунды, называют частотой смены кадров и измеряют в единицах FPS («frames per second»). Таким образом, открыть видео в opencv можно посредством реализации цикла последовательного вывода на экран кадров с задержкой, зависящей от значения fps видео. Давайте посмотрим, как это будет выглядеть на практике в Python!

В качестве примера я выведу на экран ролик с котом под названием «Cat.mp4». Видеоролик у меня располагается в той же директории, что и файл с кодом, поэтому путь к видео совпадает с именем файла: «Cat.mp4». Для начала предлагаю взглянуть на полный код в Python для вывода видео. Ниже мы разберем каждый этап написания кода более подробно.

Как открыть видео в opencv: код на Python

# импортируем модуль opencv
import cv2

# создадим объект VideoCapture для захвата видео
cap = cv2.VideoCapture('Cat.mp4')

# Если не удалось открыть файл, выводим сообщение об ошибке
if cap.isOpened() == False:
    print('Не возможно открыть файл')

# Пока файл открыт
while cap.isOpened():
    # поочередно считываем кадры видео
    fl, img = cap.read()
    # если кадры закончились, совершаем выход
    if img is None:
        break
    # выводим текущий кадр на экран
    cv2.imshow("Cat", img)
    # при нажатии клавиши "q", совершаем выход
    if cv2.waitKey(25) == ord('q'):
        break

# освобождаем память от переменной cap
cap.release()
# закрываем все открытые opencv окна
cv2.destroyAllWindows()

Разбор кода:

1. Прежде всего, необходимо связать видеопоток с переменной cap. Для этого мы создадим объект VideoCapture(), предназначенный для захвата видео. В качестве параметра для данного объекта укажем путь к видеофайлу. У меня файл с кодом и видеоролик расположены в одной директории, поэтому путь совпадает с названием видео:

cap = cv2.VideoCapture('Cat.mp4')

Кстати, в качестве параметра для объекта VideoCapture можно указать номер видеоустройства, определенного в системе вашего компьютера. Встроенная в ноутбук видеокамера, например, имеет номер ‘0‘. Поэтому, если Вам понадобится вывести на экран видеопоток с камеры, то строка с определением переменной cap будет выглядеть следующим образом: cap = cv2.VideoCapture(0). В конце статьи я размещу код для захвата видеопотока с камеры.

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

  ...
if cap.isOpened() == False:
    print('Не возможно открыть файл')

Самая распространенная причина ошибки в данном случае — это отсутствие файла по указанному пути в VideoCapture(«путь_к_файлу»).

3. Если же инициализация видеозахвата произведена успешно, то в цикле while осуществляем поочередное считывание кадров из видеофайла при помощи функции cap.read():

  ...
while cap.isOpened():
    fl, img = cap.read()

При этом в переменной img сохраняем текущий кадр, а в переменную fl передаем маркер захвата текущего кадра. В случае успеха fl=True, если же кадр не удалось открыть, то fl=False.

Если в переменную img было передано None, значит предыдущий кадр был последним, и следует совершить выход из цикла. Поэтому добавим в цикл следующую проверку:

 ...
while cap.isOpened():
    fl, img = cap.read()
    # если кадры закончились, совершаем выход
    if img is None:
        break

4. Если текущий кадр успешно прочитан, выведем его на экран с помощью функции cv2.imshow(«Cat», img). В качестве параметров зададим имя окна, в котором будет открываться видео («Cat»), а также переменную с кадром img. После этого добавим задержку в 25 мс и выполним проверку на нажатие пользователем клавиши «q». Нажатие клавиши «q» будет означать «quiet», то есть «выход» и инициализировать закрытие окна с видео.

  ...
while cap.isOpened():
    fl, img = cap.read()
    if img is None:
        break
    
    # выводим текущий кадр на экран
    cv2.imshow("Cat", img)
    # при нажатии клавиши "q", совершаем выход
    if cv2.waitKey(25) == ord('q'):
        break

Задержка 25 мс определяет, через какой промежуток времени текущий кадр будет заменен на следующий. Этот промежуток мы можем вычислить по частоте смены кадров ( или значению fps) в текущем видеоролике. Например, если в вашем видео 40 fps, это значит, что смена кадров происходит каждые 25 мс (в 1с содержится 1000мс, значит 1000(мс):40 = 25(мс)).

5. После отработки цикла while и закрытия файла, необходимо «прибрать за собой»: почистить память, закрыть окна. Для этого добавим функции cap.release() и cv2.destroyAllWindows() в конец кода:

import cv2
cap = cv2.VideoCapture('Cat.mp4')
if cap.isOpened() == False:
    print('Не возможно открыть файл')

while cap.isOpened():
    fl, img = cap.read()
    if img is None:
        break
    cv2.imshow("Cat", img)
    if cv2.waitKey(25) == ord('q'):
        break

# освобождаем память от переменной cap
cap.release()
# закрываем все открытые opencv окна
cv2.destroyAllWindows()

6. Вот и настал момент истины: код завершен, пора приступать к тестированию! У меня, как и планировалось, успешно запускается видеофайл с котом:

Как открыть видео в OpenCV

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


У нас появился Telegram-канал для изучающих Python! Присоединяйтесь: вместе «питонить» веселее! 😉 Ссылка на канал: «Кодим на Python!»


В заключение, добавляю обещанный код для вывода видео с камеры:

Если номер видеоустройства, через который планируется считывать видеопоток, определен в системе как «0» (что актуально для встроенных в ноутбук камер), то полный код для осуществления видеозахвата с камеры выглядит так:

# импортируем модуль opencv
import cv2

# связываем видеопоток с переменной cap
cap = cv2.VideoCapture(0)

# Если не удалось открыть файл, выводим сообщение об ошибке
if cap.isOpened() == False:
    print('Не возможно открыть файл')

# Пока файл открыт
while cap.isOpened():
    # поочередно считываем кадры видео
    fl, img = cap.read()
    # если кадры закончились, совершаем выход
    if img is None:
        break
    # выводим текущий кадр на экран
    cv2.imshow("Cat", img)
    # при нажатии клавиши "q", совершаем выход
    if cv2.waitKey(25) == ord('q'):
        break

# освобождаем память от переменной cap
cap.release()
# закрываем все открытые opencv окна
cv2.destroyAllWindows() 

Обратите внимание, что этот код отличается от кода для вывода видео из файла только одной строкой:

# связываем видеопоток с переменной cap
cap = cv2.VideoCapture(0)

В случае захвата видео с камеры, мы предаем объекту VideoCapture номер камеры: cap = cv2.VideoCapture(0).

Тогда, как при выводе видеоролика на экран, мы указывали объекту VideoCapture путь к файлу: cap = cv2.VideoCapture(‘Cat.mp4’).

Кстати, следующий момент не принципиален, однако, можно поменять имя окна при выводе видео с камеры, c «Cat» например, на «Желаю успешного кодинга! :-)»

cv2.imshow("Желаю успешного кодинга! :-)", img)

Добавить комментарий