使用opencv获得所需帧率的imshow()

时间:2018-10-14 19:10:42

标签: python opencv

有没有解决方法,如何在特定帧频下使用cv2.imshow()?我通过VideoCapture捕获视频并对其进行一些简单的后处理(都在一个单独的线程中,因此它将所有帧加载到Queue中,并且主线程不会因计算而变慢)。我尝试通过计算用于从队列“读取”图像的时间来固定帧速率,然后从一帧可用的毫秒数中减去该值: 如果我具有50FPS的输入视频,并且想实时播放,则每帧执行1000/50 => 20ms。 然后使用cv2.WaitKey()等待该时间 但是我仍然得到一些落后的输出。这比源视频要慢

2 个答案:

答案 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()