我有视频文件,我试图一次处理一帧。我尝试使用VideoCapture类进行以下类型的代码阅读。问题是如果以25帧/秒的速度录制视频文件,则读取速度相同。如何像我的电脑一样快速地获取帧可以解码它们?
我计划处理视频流,然后将其存储到文件中。
import cv2
import sys
import time
cap = cv2.VideoCapture(sys.argv[1])
start = time.time()
counter = 0
while True:
counter += 1;
image = cap.read()[1]
if counter %25 == 0:
print "time", time.time() - start
输出:每25帧打印一次时间戳。注意时间戳在每一行上几乎完全改变1秒=>程序处理大约每秒25帧。这与视频文件是25帧/秒。
time 1.25219297409
time 2.25236606598
time 3.25211691856
time 4.25237703323
time 5.25236296654
time 6.25234603882
time 7.252161026
time 8.25258207321
time 9.25195503235
time 10.2523479462
对于这类工作,VideoCapture可能是错误的API,但是要使用什么呢?
使用Linux,Fedora 20,opencv-python 2.4.7和python 2.7.5。
答案 0 :(得分:8)
如果opencv编译为而没有 ffmpeg支持,我可以重现您描述的行为(即cv::VideoCapture >> image
锁定到录制视频的帧速率)。如果我使用 ffmpeg支持编译opencv ,我可以像我的计算机允许的那样快速地从文件中读取图像。我认为在没有ffmpeg的情况下,opencv使用gstreamer并且基本上将视频文件视为播放电影。
如果您使用的是Linux,this link会显示您必须安装哪些软件包才能获得对opencv的ffmpeg支持。
答案 1 :(得分:0)
我还没试过这个,但我认为它可以用于保存在机器上的有限长度的视频文件(即不是实时网络摄像头)。只有可预见的下行算法"可能"如果它没有足够快地处理但是它可能只是没有读取下一帧,则跳过帧。我认为一般来说,VideoCapture读取速度比FPS慢,但读取速度不快。不要引用我的话,但我认为我注意到了这一点。
使用VideoCapture::set()将FPS更改为比计算机上的文件更快的速度。 CV_CAP_PROP_FPS是您要更改的内容。
使用VideoCapture::get()功能验证fps是否已正确设置。