在OpenCV中获取当前帧数

20

我该如何使用OpenCV获取视频的当前帧数?OpenCV是否有内置函数可以获取当前帧数,还是我需要手动完成?

4个回答

40

您可以像以下示例一样使用捕获对象的“get”方法:

capture.get(CV_CAP_PROP_POS_FRAMES); // retrieves the current frame number

还有:

capture.get(CV_CAP_PROP_FRAME_COUNT); // returns the number of total frames 
顺便提一句,这些方法返回一个double值。
如果你使用旧的C接口,也可以使用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是视频中当前帧的位置(例如视频的第55帧)。
  • POS_AVI_RATIO是当前位置作为介于0和1之间的数字(当您想定位滑块以允许用户在视频中导航时,这实际上非常有用)。
  • FRAME_WIDTH和FRAME_HEIGHT是要读取的视频每个帧的尺寸(或以摄像头的当前设置捕获)。
  • FPS特定于视频文件,并指示拍摄视频时每秒的帧数。如果您想播放视频并使其以正确的速度播放,则需要知道这一点。
  • FOURCC是当前读取的视频所使用的压缩编解码器的四字符代码。
  • FRAME_COUNT应该是视频中的总帧数,但此数字不是完全可靠的。
(来自《学习OpenCV》书籍)

11
在 openCV 的版本 3.4 中,正确的标志是:
cap.get(cv2.CAP_PROP_POS_FRAMES)

适用于 opencv-contrib-python 版本 4.5.2.54。 - Volkov Maxim

5
在OpenCV Python中实现这个功能的方法如下:
import cv2
cam = cv2.VideoCapture(<filename>);
print cam.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)

我遇到了类似的问题。我一直在尝试找到当前帧数。我尝试使用“cam.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)”,但它给了我一个错误:“numpy.ndarray”对象没有属性“get”。 - user191762

0
我知道可能有点晚了,但是我想补充一些答案。根据一个文档所说,我们可以将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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接