# python读取视频流提取视频帧的方法
注意事项(路径尽量全部英文,不然很可能会耽误很多时间)
安装环境:
pip install imageio pip install skimage
这时候会报错:
Please install the scikit-image
package (instead of skimage
)
所以按照提示操作即可:
pip install scikit-image
环境安装成功。
{% image /imgs/2019012211141851.png '在这里插入图片描述' '' %}2、cv2模块安装,刚开始看到别人写的import cv2 以为是需要安装pip install cv2(尴尬。。。结果是 pip install opencv-python)
pip install opencv-python
3、视频截帧代码
方法一:
使用imageio库提取视频帧
imageio官方文档地址:http://imageio.readthedocs.io/en/latest/examples.html
# coding:utf-8
import imageio
import pylab
# 注释的代码执行一次就好,以后都会默认下载完成
# imageio.plugins.ffmpeg.download()
# 视频的绝对路径
filename =r'e:\video\159725149.mp4'
# 可以选择解码工具
# print(filename)
# vid = imageio.get_reader(uri=filename, format='ffmpeg')
vid = imageio.get_reader(filename ,'ffmpeg')
print(type(vid),len(vid))
try:
# 这个地方需要加个异常处理,我也不知道什么原因,用imageio读取的视频总是最后俩帧是无法读取,用俩个视频测试都是如此,就加个异常,忽略最后俩帧就可以了。
for num, im in enumerate(vid):
print(num)
if (num % 101) == 0:
imageio.imwrite('E:\save_photo_from_video\{}.jpg'.format(num // 101), im)
except imageio.core.format.CannotReadFrameError or RuntimeError:
pass
# for num, im in enumerate(vid):
# print(num)
# if (num % 101) == 0:
# imageio.imwrite('E:\save_photo_from_video\{}.jpg'.format(num // 101), im)
方法二:
需要安装opencv-python,也就是导入cv2模块。
''' pip install opencv-python'''
用法:
#!usr/bin/python
import cv2
# 需要安装opencv-python
''' pip install opencv-python'''
# 读入视频文件
vc = cv2.VideoCapture(r'D:\zjf_workspace\000爬虫代码-基础的\scrapy_100_工具\视频处理\mp4\55563878.mp4')
c = 1
if vc.isOpened():
# 判断是否正常打开
real, frame = vc.read()
# print(real)
else:
real = False
timeF = 100
# 视频帧计数间隔频率
while real:
real, frame = vc.read()
# print(real, frame)
if (c % timeF == 0):
# 每隔timeF帧进行储存为图像,(注意保存地址必须全部为英文和数字,不能含有中文或者中文字符,我这个错误就是刚开始不知道是地址中文原因,找了好久。)
cv2.imwrite(r'E:\save_photo_from_video' + '\\' + str(c // timeF) + '.jpg', frame)
c += 1
cv2.waitKey(1)
vc.release()
参考文章:
https://blog.csdn.net/NFMSR/article/details/78559930
https://blog.csdn.net/xinxing__8185/article/details/48440133