猿问

Cap.read() 是否会跳过相机流中的帧,但从文件运行时不会?

我注意到一个我在文档中没有找到答案的行为。

当我使用 VideoCapture(0) 从相机捕获流时,检查下面的代码,我注意到由于我在代码中放入的延迟,一些帧被跳过。


但是当我播放视频时,它不会跳过帧。


cap = cv2.VideoCapture(0)

#cap = cv2.VideoCapture("awesomevideo.mp4")     

while True :

    # Get a new frame from camera

    retval, frame = cap.read()

    time.sleep(1)

    # Display images

    cv2.imshow("frame", frame)

我是否正确理解了这种行为,或者这是我的代码的问题?当然,这只是一个测试脚本,当我处理来自相机的流时,我注意到了这个问题,我的 while 循环将花费 0.4 秒,然后它会抓取下一帧(它会跳过中间的一些帧),但是当我保存时同样的视频并决定进行离线处理,我注意到它不会跳过帧,即,它只是等到我处理完帧才给我下一个,不像相机那样只抓取相机现在显示的任何内容。


明月笑刀无情
浏览 71回答 1
1回答

RISEBY

您无法获得现实世界中的所有帧。帧速率将是无限的,这是不可能的。相机尝试在捕获持续时间和处理时间的限制内捕获尽可能多的帧。通过添加sleep,您可以增加处理时间。录制的视频具有来自现实世界的离散帧样本,这足以让我们感知流,就好像它无限流动一样。人眼每秒捕获 24 帧。如果视频的目的是用于鸟类,则帧速率应至少为 80。知道了这些,应该就清楚为什么VideoCapture会像你说的那样了。相机试图从现实世界中捕捉尽可能多的帧。对于录制的视频,您已经拥有了所有帧。作为脚注,出于显示目的,您应该使用 aftercv2.waitKey(1)而不是time.sleep(1)after 。
随时随地看视频慕课网APP

相关分类

Python
我要回答