2017-08-24 86 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。 –