繁体   English   中英

读取固定帧率的视频文件

[英]Read video file with fixed frame rate

我用我的相机和 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()

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

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

灵感来自你的回答:

while(cap.isOpened()):

  ret, frame = cap.read()

  now = time.time()
  frameLimit = 2.0

  #Do your stuff

  timeDiff = time.time() - now
  if (timeDiff < 1.0/(frameLimit)): sleep( 1.0/(frameLimit) - timeDiff )

这是此问题的有效解决方案:

fps = vid.get(cv2.CAP_PROP_FPS)

while True:
    now = time.time()
    _, frame = vid.read()

    #Do your thing

    timeDiff = time.time() - now
    if (timeDiff < 1.0/(fps)):
        time.sleep(1.0/(fps) - timeDiff)

由于这是一个现有的视频文件,您无法更改其 FPS。 但是,当您读取视频文件时,您可以更改每帧之间的读取间隔。 这是我以固定帧速率 25 fps 读取的解决方案。 这是代码:

import numpy as np
import cv2
import sys

cap = cv2.VideoCapture('C:/Media/videos/Wildlife.wmv')

# Check if camera opened successfully
if (cap.isOpened()== False): 
    print("Error opening video stream or file")

fps = 25
#if you want to have the FPS according to the video then uncomment this code
#fps = cap.get(cv2.CAP_PROP_FPS)

#calculate the interval between frame. 
interval = int(1000/fps) 
print("FPS: ",fps, ", interval: ", interval)
# Read the video
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow('Frame',gray)
        if cv2.waitKey(interval) & 0xFF == ord('q'):
            break
    # Break the loop
    else: 
        break

cap.release()
cv2.destroyAllWindows()

您可以添加所需的 fps 代替下面的“fps”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM