Получение текущего номера кадра в 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()
Другие вопросы по тегам