将视频转换成图片然后处理也是处理视频的一种方法之一,所以重要的就是将视频转换成图片了。这里仅介绍一种逐帧提取图片并保存的方法。(看明白代码以后可以自行修改吗,满足隔几帧提取一帧等需求)
import cv2
import glob
import os
from datetime import datetime
def video_to_frames(path):
"""
输入:path(视频文件的路径)
"""
# VideoCapture视频读取类
videoCapture = cv2.VideoCapture()
videoCapture.open(path)
# 帧率
fps = videoCapture.get(cv2.CAP_PROP_FPS)
# 总帧数
frames = videoCapture.get(cv2.CAP_PROP_FRAME_COUNT)
print("fps=", int(fps), "frames=", int(frames))
for i in range(int(frames)):
ret, frame = videoCapture.read()
cv2.imwrite("D:\\wangyang\\images\\frames%d.jpg" % (i), frame)
return
if __name__ == '__main__':
t1 = datetime.now()
video_to_frames("D:\\wangyang\\图像识别\\1\\视频.avi")
t2 = datetime.now()
print("Time cost = ", (t2 - t1))
print("SUCCEED !!!")
首先定义一个函数从视频中提取图片的函数
def video_to_frames(path):
输入参数(path)是视频文件在你电脑上的绝对路径
紧接着利用cv2库中的VideoCaoture类来处理视频
# VideoCapture视频读取类
videoCapture = cv2.VideoCapture()#创建一个类
videoCapture.open(path)#利用类中的open方法打开视频文件
然后通过get方法(利用不同参数)获取视频的帧率和帧数(这里可以根据自己的需求来确定是否需要这是数据)
# 帧率
fps = videoCapture.get(cv2.CAP_PROP_FPS)
# 总帧数
frames = videoCapture.get(cv2.CAP_PROP_FRAME_COUNT)
print("fps=", int(fps), "frames=", int(frames))
然后通过一个简单的循环读取视频中的每一帧
for i in range(int(frames)):
ret, frame = videoCapture.read()
cv2.imwrite("D:\\wangyang\\images\\frames%d.jpg" % (i), frame)
return
这里主要用到了imwrite函数(具体用法可以看这里),值得注意的是这里的存储路径不要有中文(第一个参数),虽然运行不会出错但是保存会有问题!!!!很显然,对这里的循环体进行简单的修改就可以实现隔几帧抽取一帧,比如下面的例子
j=0
for i in range(int(frames)):
j=i+3;
ret, frame = videoCapture.read()
if j%3==0:
cv2.imwrite("D:\\wangyang\\images\\frames%d.jpg" % (i), frame)
return
当然这是一种比较笨的方法,应该还有一些比较简便的方法,这里就不在赘述了。
最后就是调用之前的函数来实现我们的需求了
if __name__ == '__main__':
t1 = datetime.now()
video_to_frames("D:\\wangyang\\图像识别\\1\\视频.avi")
t2 = datetime.now()
print("Time cost = ", (t2 - t1))
print("SUCCEED !!!")
这里没有什么特别要注意的,t1,t2只是为了记录调用函数所花费的时间,要说的是当视频的帧数较大时会运行速度会很慢,因为涉及到大量的图片的写入(会很花时间)。
代码来源此博主的博客在其中做了一些简单的修改实际运行是成功的!