OpenCV Python视频播放 - 如何为cv2.waitKey()设置正确的延迟时间

16
我使用以下代码来捕获视频文件,将其翻转并保存。
#To save a Video File

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.cv.CV_FOURCC(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

这个程序会将输出保存为output.avi

现在,要回放视频文件,我使用了以下程序

#Playing Video from File

import numpy as np
import cv2

cap = cv2.VideoCapture('output.avi')

print cap.get(5) #to display frame rate of video
#print cap.get(cv2.cv.CV_CAP_PROP_FPS)

while(cap.isOpened()): 
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #convert to grayscale

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'): 
        break

cap.release()
cv2.destroyAllWindows()

这个程序播放了第一个程序保存的视频文件output.avi。问题是,这个视频看起来像快进了。所以,我尝试改变cv2.waitKey()函数的延迟值。当我把它设为100时,视频看起来很正常。但是我如何知道该设什么值呢?应该和帧率有关吗?我检查了output.avi的帧率(在第二个程序中的线cap.get(5)),得到20。但是如果我把cv2.waitKey()的延迟设为20,视频仍然太快。

任何帮助将不胜感激。

3个回答

19

OpenCV文档中获取:

cv.waitKey([, delay])函数无限期地等待按键事件(当delay <= 0时)或等待delay毫秒(当delay为正数时)。

如果FPS等于20,则应在显示连续帧之间等待0.05秒。 因此,只需在imshow()之后放置waitKey(50),以实现所需的回放速度。


4
所以公式应该是(1 / fpm)* 1000 吗? - Euler_Salter
5
也许需要将其作为整数处理,因此可以使用 int((1/int(fps))*1000)。注意不要改变原本的意思。 - Euler_Salter
1
@Kornel,我怎么知道FPS是多少? - mLstudent33
fps = cap.get(cv2.CAP_PROP_FPS)fps = cap.get(cv2.CAP_PROP_FPS) - Cuinn Herrick

2
imshow()之后加入waitKey(60),就可以以正常速度显示了。"Original Answer"的翻译是"最初的回答"。

2

说实话,我尝试过各种设置cv2.waitKey()延迟时间的方法,但都失败了。我发现有效的方法是在while(cap.isOpened())中尝试以下代码:key = cv2.waitKey(1)

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.cv.CV_FOURCC(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
  ret, frame = cap.read()
  if ret==True:
      key = cv2.waitKey(1)
      frame = cv2.flip(frame,0)

      # write the flipped frame
      out.write(frame)

      cv2.imshow('frame',frame)
      if key & 0xFF == ord('q'):
          break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

我希望这能帮助到一些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接