Получение текущего номера кадра в OpenCV
Как я могу получить текущий номер кадра видео, используя OpenCV? Есть ли в OpenCV какие-либо встроенные функции для получения текущего кадра, или я должен сделать это вручную?
4 ответа
Вы можете использовать метод "get" вашего объекта захвата, как показано ниже:
capture.get(CV_CAP_PROP_POS_FRAMES); // retrieves the current frame number
а также:
capture.get(CV_CAP_PROP_FRAME_COUNT); // retuns the number of total frames
Кстати, эти методы возвращают двойное значение.
Вы также можете использовать метод cvGetCaptureProperty.
cvGetCaptureProperty (CvCapture * capture, int property_id);
Ниже приведены параметры property_id с определениями:
CV_CAP_PROP_POS_MSEC 0
CV_CAP_PROP_POS_FRAME 1
CV_CAP_PROP_POS_AVI_RATIO 2
CV_CAP_PROP_FRAME_WIDTH 3
CV_CAP_PROP_FRAME_HEIGHT 4
CV_CAP_PROP_FPS 5
CV_CAP_PROP_FOURCC 6
CV_CAP_PROP_FRAME_COUNT 7
POS_MSEC - текущая позиция в видеофайле, измеренная в миллисекундах. POS_FRAME - это текущая позиция в номере кадра. POS_AVI_RATIO - это позиция, заданная в виде числа от 0 до 1 (это на самом деле весьма полезно, когда вы хотите расположить трекбар, чтобы люди могли перемещаться по вашему видео). FRAME_WIDTH и FRAME_HEIGHT - это размеры отдельных кадров видео для чтения (или для захвата с текущими настройками камеры). FPS определяется для видеофайлов и указывает количество кадров в секунду, с которых было снято видео; вам нужно знать об этом, если вы хотите воспроизвести видео и получить его с нужной скоростью. FOURCC - это четырехсимвольный код для кодека сжатия, который будет использоваться для видео, которое вы сейчас читаете. FRAME_COUNT должно быть общим количеством кадров в видео, но эта цифра не совсем надежна. (из книги "Изучение OpenCV")
В openCV версии 3.4 правильный флаг:
cap.get(cv2.CAP_PROP_POS_FRAMES)
Способ сделать это в Python OpenCV так:
import cv2
cam = cv2.VideoCapture(<filename>);
print cam.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)
Думаю, я опоздал, но я добавлю ответ. Как сказано в документации , мы можем изменить размер буфера изображений cv2 до 1, и после отображения кадра мы можем перейти к следующему кадру, пропуская наш буфер с помощью cap.grab().
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
raise IOError("Cannot open webcam")
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
while True:
ret, frame = cap.read()
cv2.imshow('frame', frame)
if cv2.waitKey(0) == ord('q'):
break
cap.grab()