2017-08-24 95 views
-1

我用我的相机拍摄了一个视频,并以25 fps的帧率固定,并试图用OpenCV读取它。阅读固定帧速率的视频文件

当我使用OpenCV读取视频文件时,它会播放,但播放速度非常快。 我希望我的程序以25 fps播放视频。如何配置OpenCV以25 fps读取视频文件?

我的代码:

import numpy as np 
import cv2 

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

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

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

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

cap.release() 
cv2.destroyAllWindows() 

回答

-1

您可以在地方 'FPS' 的添加所需的FPS低于

cap.set(cv2.cv.CV_CAP_PROP_FPS, fps) 
+0

对不起,我使用opencv 3,它没有找到cv2.cv.CV_CAP_PROP_FPS。 –

+0

这对阅读视频文件没有任何影响。 (不应该 - 你需要的最后一件事是你的I/O代码浪费时间无所事事)。 –

0

我找到了一些解决方案。 我把一个延迟时间捕获循环。我从视频文件捕获新图像之前检查延迟。这是我的解决方案代码。 谢谢大家。

import numpy as np 
import cv2 
from time import time as timer 
import sys 

    video = cv2.VideoCapture('2.avi') 
    fps = video.get(cv2.CAP_PROP_FPS) 
    fps /= 1000 
    framerate = timer() 
    elapsed = int() 
    cv2.namedWindow('ca1', 0) 
    while(video.isOpened()): 

     start = timer() 
     # print(start) 
     ret, frame = video.read() 

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

     diff = timer() - start 
     while diff < fps: 
      diff = timer() - start 

     elapsed += 1 
     if elapsed % 5 == 0: 
      sys.stdout.write('\r') 
      sys.stdout.write('{0:3.3f} FPS'.format(elapsed/(timer() - framerate))) 
      sys.stdout.flush() 

    video.release() 
    cv2.destroyAllWindows() 
+0

为什么不在正确的延迟上使用'waitKey',而不是额外的忙等待? –

+0

谢谢你,因为你的建议Dan Masek。 –