显然,CAP_PROP_POS_AVI_RATIO
(常量 2,您在中使用的cap.set()
)效果不好。看一下修改后的脚本的输出:
import cv2
from numpy import integer
number = 10
filename = 'chaplin.mp4'
def uniform():
cap = cv2.VideoCapture(filename)
frame_count= int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(frame_count)
for x in range(0, number):
frame_pos_ratio = 1.0*x/number
frame_no_int=int(frame_pos_ratio*frame_count)
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_no_int)
print (frame_no_int, cap.get(cv2.CAP_PROP_POS_AVI_RATIO))
ret, frame = cap.read()
cv2.imwrite('_frame_'+str(frame_no_int)+'.jpg', frame)
# Attempt to go the end of film
cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1)
print (cap.get(cv2.CAP_PROP_POS_FRAMES))
# When everything done, release the capture
cap.release()
if __name__ == '__main__':
uniform()
Output:
172
(0, 6.510416666666667e-05)
(17, 6.510416666666667e-05)
(34, 6.510416666666667e-05)
(51, 6.510416666666667e-05)
(68, 6.510416666666667e-05)
(86, 6.510416666666667e-05)
(103, 6.510416666666667e-05)
(120, 6.510416666666667e-05)
(137, 6.510416666666667e-05)
(154, 6.510416666666667e-05)
150.0
如你看到的,cap.get(cv2.CAP_PROP_POS_AVI_RATIO)
循环内只返回一个常量6.51e-05
.
即使有 174 帧,cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1)
只带你到第 150 帧,这绝对是一个错误。
此行为符合这个问题 https://stackoverflow.com/questions/47162334/python-opencv-getcap-prop-pos-avi-ratio-returning-a-fixed-number-in-while-loop.
附:有趣的是,甚至cv2.CAP_PROP_FRAME_COUNT
无法正常工作。显然,我的视频文件仅包含 150 帧,但它们的编号从 22 到 171,如下所示ffprobe -show_frames chaplin.mp4 | grep coded_picture_number
。因此 CAP_PROP_FRAME_COUNT 的输出只是 max(frame_no)+1。