Начнем с истоков. Что такое видео? Видео представляет собой последовательность изображений или кадров, которые непрерывно следуют друг за другом. Число изображений, которые успевают смениться в течение одной секунды, называют частотой смены кадров и измеряют в единицах 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. Вот и настал момент истины: код завершен, пора приступать к тестированию! У меня, как и планировалось, успешно запускается видеофайл с котом:

По окончанию ролика, окно закрывается. Кроме того, закрытие окна происходит при нажатии клавиши с буквой «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)