为什么opencv不能访问vid的最后一帧

2024-09-23 08:26:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用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(所以我无法访问视频的最后一秒)。如果我通过第305帧,就会收到一条错误消息

^{pr2}$

fps也有点奇怪-显示33帧/秒,而我期望的是24或30帧。视频是用Astra图像网络摄像头视频抓取器录制的,它是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计算的帧数就是期望的帧数。在


Tags: pathgetframes视频cv2framelengthcap