为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

明月笑刀无情 2023-09-19 14:03:52
我注意到一个我在文档中没有找到答案的行为。当我使用 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 秒,然后它会抓取下一帧(它会跳过中间的一些帧),但是当我保存时同样的视频并决定进行离线处理,我注意到它不会跳过帧,即,它只是等到我处理完帧才给我下一个,不像相机那样只抓取相机现在显示的任何内容。
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您无法获得现实世界中的所有帧。帧速率将是无限的,这是不可能的。相机尝试在捕获持续时间和处理时间的限制内捕获尽可能多的帧。通过添加sleep,您可以增加处理时间。

录制的视频具有来自现实世界的离散帧样本,这足以让我们感知流,就好像它无限流动一样。人眼每秒捕获 24 帧。如果视频的目的是用于鸟类,则帧速率应至少为 80。

知道了这些,应该就清楚为什么VideoCapture会像你说的那样了。相机试图从现实世界中捕捉尽可能多的帧。对于录制的视频,您已经拥有了所有帧。

作为脚注,出于显示目的,您应该使用 aftercv2.waitKey(1)而不是time.sleep(1)after 。


查看完整回答
反对 回复 2023-09-19
  • 1 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信