我在使用openCV(用2.4和3测试)和python2.7阅读AVI视频时遇到了一些问题。视频的持续时间约为20分钟。在
在一定数量的帧之后,我得到一个空帧和一个假标志,表示该帧无法读取。我读取帧的方式是使用“CAP_PROP_POS_FRAMES”或“CAP_PROP_POS_MSEC”设置帧编号。 但是,当我用任何其他播放器(VLC、Windows Media player)打开视频时,它可以播放整个持续时间。在
如上所述,opencv2.4.11和3.0.0-rc1都会出现问题。在
我运行了一个测试,在那里我读取帧直到发生上述情况,都使用时间和帧编号设置帧。结果如下。在
密码在这里
pathname = "C:\\videos"
# get all videofiles
videofiles = [file for file in os.listdir(os.path.join(pathname)) if file.endswith(".avi")]
nofalse = 0
v = 0
for vf in videofiles[1:]:
v += 1
# Test using frame number for seeking to frame
# Open video file
cap = cv2.VideoCapture(os.path.join(pathname, vf))
totalnoframes = cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
frange = np.arange(0, totalnoframes, 100)
for f in frange:
cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, f)
ret, frame = cap.read()
if ret is False:
break
# close video file
cap.release()
# Test using time for seeking to frame
# Open video file
cap = cv2.VideoCapture(os.path.join(pathname, vf))
totalnoframes = cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
totaldurationMS = 1000*totalnoframes/cap.get(cv2.cv.CV_CAP_PROP_FPS)
trange = np.linspace(0, totaldurationMS, totalnoframes)[::100]
for t in trange:
cap.set(cv2.cv.CV_CAP_PROP_POS_MSEC, t)
ret, frame = cap.read()
if ret is False:
break
cap.release()
# print results
vf = "Video %1.0f" % v
print "%s:\t%1.0f\t%1.2f\t%1.0f\t%1.2f" % (vf, t, t/np.float(totaldurationMS), f, f/np.float(totalnoframes))
结果就在这里。 第一个数字列是最后一个以毫秒为单位的可读帧,第二个列显示使用时间读取的总帧的速率,第三个列是数字中的最后一个读取帧,以及读取帧的速率。在
似乎最高帧数限制在14000帧左右,并且没有总帧数较少的视频在读取帧时显示相同的限制。在
有人知道为什么会这样吗?我花了好几天的时间想弄明白这一点,运气不好。非常感谢任何帮助!在
谢谢你!在
视频1:940046 0.69 14100 0.69
视频2:980045 0.68 14700 0.68
视频3:973372 0.59 14600 0.59
视频4:940047 0.70 14100 0.70
视频5:953370 0.54 14300 0.54
视频6:940063 0.95 14100 0.95
视频7:506733 0.99 7600.99
视频8:1040047 0.70 15600 0.70
视频9:806733 1.00 12100 1.00
视频10:940056 0.85 14100 0.85
视频11:620066 0.99 9300 0.99
视频12:880066 0.99 13200 0.99
视频13:953371 0.56 14300 0.56
视频14:1026727 0.90 15400 0.90
目前没有回答
相关问题 更多 >
编程相关推荐