日常生活中可能会遇到一种需要从视频文件中抓取关键画面的情况,如刑侦警察断案看案件视频监控关键帧,特别是做美工的同事(当然他们有诸如premier和AE这样的专业软件可以实现),一般人手动暂定播放并截图的确可以做到,但还是有点累,下面要说的方法是利用Python实现的(当然Python还是比较方便,支持的库很多,C/C++,QT等等都是可以实现的),其实原理也简单,利用第三方库(主要OpenCV,很多视频图像处理都是用它)获取视频文件属性,包括帧率和时长,那么会得出所要生成的帧数 = 帧率 X 时长,确定了帧数后面第三方库就对视频进行等分处理保存图片了。
在正式处理之前,咱们可以对视频文件进行初次编辑,如只想对01:20:30 - 1:21:45之间这段内容进行编辑,一个笨方法是利用QQ影音自带视频截取功能或格式工厂进行操作生成新的视频片段,视频的帧率也可以重新编辑,从格式工厂里面操作即可改变帧率,提高帧数,具体操作请自行百度。
自从近一两年Python的广告加剧铺天盖地无孔不入以来,内心对Python产生了嫌弃之意,行动上也不再碰它好久了,但不得不承认在某些方面它还是表现的很好滴。
#以下两种方式均可以实现逐帧保存图片的目的
import cv2
import numpy as np
def save_image(image,addr,num):
#存储的图片路径
address=addr+str(num)+'.jpg'
#存储图片
cv2.imwrite(address,image)
#读入视频
videoCapture=cv2.VideoCapture("E:\Python Project\GetFrame\Video\Frame.mp4")
#读取视频帧
success,frame=videoCapture.read()
i=0
while success:
i=i+1
#保存图片,图片名称是img5.jpg
save_image(frame,'E:\Python Project\GetFrame\Image\img',i)
if success:
print('save image:',i)
else:
print('save img done!')
break
#读取视频帧
sucess,frame=videoCapture.read()
# 下方代码保存的是PNG格式,占用空间较大
# import cv2
# import os
#
#
# def save_img():
# video_path = 'E:/Python Project/GetFrame/Video'
# videos = os.listdir(video_path)
# for video_name in videos:
# file_name = video_name.split('.')[0]
# folder_name = video_path + file_name
# os.makedirs(folder_name, exist_ok=True)
# vc = cv2.VideoCapture(video_path + '/' + video_name)
# c = 0
# rval = vc.isOpened()
#
# while rval:
# c = c + 1
# rval, frame = vc.read()
# pic_path = folder_name + '/'
# if rval:
# cv2.imwrite(pic_path + str(c) + '.png', frame)
# cv2.waitKey(1)
# else:
# break
# vc.release()
# print('save_success')
# print(folder_name)
#
#
# save_img()
注意:若pycharm提示无cv,需通过IDE下载安装pythoncv.
以上代码为网友提供,实现代码很多,博主只是微调运行测试了一下,效果不错,以做记录留存。