有没有解决方法,如何在特定帧频下使用cv2.imshow()
?我通过VideoCapture捕获视频并对其进行一些简单的后处理(都在一个单独的线程中,因此它将所有帧加载到Queue中,并且主线程不会因计算而变慢)。我尝试通过计算用于从队列“读取”图像的时间来固定帧速率,然后从一帧可用的毫秒数中减去该值:
如果我具有50FPS的输入视频,并且想实时播放,则每帧执行1000/50 => 20ms。
然后使用cv2.WaitKey()等待该时间
但是我仍然得到一些落后的输出。这比源视频要慢
答案 0 :(得分:1)
我不相信opencv中有这样的功能,但是也许您可以通过使用计时器添加动态等待时间来改进您的方法? timeit.default_timer()
计算处理所需的时间,并从预期的帧速率中减去该时间,并可能添加几毫秒的缓冲区。
例如cv2.WaitKey((1000/50) - (time processing finished - time read started) - 10)
或者您可能会有更严格的时间安排,例如script start time + frame# * 20ms - time processing finished
我还没有亲自尝试过,因此无法确定它是否会真正起作用,也可能值得检查一下,因此该数字不会低于1
答案 1 :(得分:1)
我在我的一个项目中遇到了相同的视频,其中我的源视频具有 2 fps。所以为了使用 cv2.imshow 以良好的方式显示它,我在显示帧之前使用了延迟功能。它是一种黑客,但这个东西对我有用。下面给出了这个 hack 的代码。希望你能从中得到一些帮助。和平!
import cv2
import numpy as np
import time
cap = cv2.VideoCapture (0)
width = 400
height = 350
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, (width, height))
flipped = cv2.flip(frame, 1)
framerot = cv2.rotate(frame, cv2.ROTATE_90_COUNTERCLOCKWISE)
framerot = cv2.resize(framerot, (width, height))
StackImg = np.hstack([frame, flipped, framerot])
#Put time of sleep according to your fps
time.sleep(2)
cv2.imshow("ImageStacked", StackImg)
if cv2.waitKey(1) & 0xff == ord('q'):
break
cv2.destroyAllWindows()