话不多说,直接上代码
import cv2
def capFrame(videoPath, savePath):
cap = cv2.VideoCapture(videoPath)
numFrame = 0
while True:
if cap.grab():
numFrame += 1
# 每60桢截取一个图片
if numFrame % 60 == 1:
#retrieve 解码并返回一个桢
flag, frame = cap.retrieve()
if not flag:
continue
else:
cv2.imshow('video', frame)
newPath = savePath + "\\" + str(int(numFrame/60)) + ".jpg"
cv2.imencode('.jpg', frame)[1].tofile(newPath)
#检测到按下Esc时,break(和imshow配合使用)
if cv2.waitKey(10) == 27:
break
capFrame('C:\\Users\\Administrator\\Desktop\\2c61544388d0110b352811dbaa8760b4.mp4','C:\\Users\\Administrator\\Desktop\\new')
值得注意的是,输入的文件路径中的分隔符应该是“\\”(在Windows下)
除此之外,因为我的需求是每60桢才截取一桢画面,所以我将判断写在了retrieve方法前面,这 是因为grab方法只是获取下一帧却并不进行解码,而retrieve方法则是解码并返回下一帧,所以retrieve方法要慢于grab方法,所以当不需要当前的帧或画面时,可以使用grab跳过。