为什么opencv无法访问最后一帧视频

时间:2017-06-16 06:25:19

标签: python opencv video

我正在尝试用Python中的OpenCV做一个非常基本的事情:获取视频文件的帧,以便以后能够用skimage分析它们并将它们保存为图片。 我有10个视频要测试,我正在用

获取视频的单帧
cap = cv2.VideoCapture(path) 
length_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_n = 305
cap.set(1,frame_n)
ret, frame = cap.read()
t = cap.get(cv2.CAP_PROP_POS_MSEC)
cv2.imshow('frame '+str(frame_n+1), frame)
cv2.waitKey()
cv2.imwrite(path.split(".")[0]+'_frame_'+str(frame_n+1)+'.jpg', frame)
cap.release()
cv2.destroyAllWindows()

问题是,帧总数length_frames=340,同时我只能从0到305(所以我无法访问视频的最后一秒)。如果我传递frame_n> 305,我会收到一条错误消息

6 ret, frame = cap.read()
7 t = cap.get(cv2.CAP_PROP_POS_MSEC)
----> 8 cv2.imshow('frame '+str(frame_n+1), frame)
9 cv2.waitKey()
10 cv2.imwrite(path.split(".")[0]+'_frame_'+str(frame_n+1)+'.jpg', frame)
error: C:\bld\opencv_1496444098483\work\opencv-3.2.0\modules\highgui\src\window.cpp:304: error: (-215) size.width>0 && size.height>0 in function cv::imshow
fps也有点奇怪 - 显示33帧/秒,我期待像24或30这样的东西。视频是用Astra Image Webcam Video Grabber记录的,带有简单的webcamera,这是noname,所以我不喜欢知道什么是真正的fps。根据Astra Video Grabber本身,它显示实时记录的帧数量,以及记录的时间,fps只有15帧/秒。但最终视频的长度只有几秒钟,然后显示Astra Video Grubber。所以我想知道,这可能是相机本身的问题,以及它是如何录制的?虽然如果我播放视频,我可以完全播放,包括最后一秒。

我尝试了几个视频,并且所有这些都是相同的:opencv计算的帧数比我可以访问的数量多。

UPD :感谢@AlexanderReynolds评论,结果发现有一个库sci-kit video,使用该库导入视频并获取帧非常简单:

videodata = skvideo.io.vread(file)
frame_i = videodata[i]  # getting i frame, which can be directly analyzed with skimage
frame_n = len(videodata) # total number of the frames in the video

使用skivideo计算的帧数是预期的帧数。

0 个答案:

没有答案