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

2024-05-23 22:37:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到一种行为,我在documentation中没有找到答案

当我使用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.4s,然后它将抓取下一帧(中间跳过了一些),但当我保存相同的视频并决定进行脱机处理时,我注意到它不会跳过帧,即,它只是等待,直到我完成处理帧,给我下一个,而不是像相机只是抓住任何相机显示现在


Tags: 答案代码truenewget视频documentationcv2
1条回答
网友
1楼 · 发布于 2024-05-23 22:37:26

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

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

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

作为脚注,您应该使用cv2.waitKey(1)而不是time.sleep(1)之后的imshow来显示。见^{}的文件

相关问题 更多 >