我注意到一个我在文档中没有找到答案的行为。当我使用 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 。
添加回答
举报
0/150
提交
取消