前言
本质上视频是由一张张图像组成,视频处理建立在图像处理之上,视频每一帧就是一张图像。首先需要配置好opencv或其它计算机视觉库,才能用程序语言来实现对视频文件一些简单的操作。本文主要使用opencv来处理视频文件。
1读取视频转化为图片
1.1函数简介
VideoCapture支持视频文件读取,也支持直接从摄像头中读取。
1.2具体操作
1读取视频文件,用VideoCapture来实例化对象获得视频源。
2判断读取是否成功
3根据需要抽帧处理
4去文件夹查看图片
1.3小例子
#导入opencv库
import cv2 as cv
video_path = "videos/ggbond.mp4" # 读取视频路径
capture = cv.VideoCapture(video_path) #实例化VideoCapture类
#查看视频文件的宽、高、帧数率以及总帧数
width = int(capture.get(cv.CAP_PROP_FRAME_WIDTH)) # 360
height = int(capture.get(cv.CAP_PROP_FRAME_HEIGHT)) # 480
fps = round(capture.get(cv.CAP_PROP_FPS)) # 30
frameCount = int(capture.get(cv.CAP_PROP_FRAME_COUNT)) # 2313
#打印出数据
print(height, width, fps, frameCount)
#视频帧数初值
frame_count = 0
#抽帧间隔
timed = 231
#检查读取是否成功
while capture.isOpened():
ret, frame = capture.read() # 读取一帧
if not ret:
break
frame_count += 1
# 设置保存路径和文件名(可以根据需要进行更改)
# 为你的图片取名格式化
save_path = "save/{}.jpg".format(frame_count)
#抽帧条件
if(frame_count%timed==0):
# 保存一帧为一张图片
cv.imwrite(save_path, frame)
capture.release() # 释放资源
以上是简单的读取一个视频转化为多张图片。自己可以先查看视频的总帧数为多少,然后设置抽帧间隔,获取自己想要的图片数量。比如,这个ggbond的视频总帧数2313,要获得获得十张图片就设置抽帧间隔为231。这样就完成了视频向图片的转换
在save文件中生成结果如下
2读取视频转化为视频
2.1函数简介
用VideoCapture读取视频文件,VideoWriter用于视频文件的写出和保存。
VideoWriter有四个参数,具体如下
cv.VideoWriter([filename, fourcc, fps, frameSize[, isColor]]) → <VideoWriter object>
filename:读取或保存的视频文件的路径,包括扩展名
fourcc:用于压缩帧的编码器/解码器的字符代码,
- CV_FOURCC(‘I’,‘4’,‘2’,‘0’),未压缩的YUV编码格式,扩展名为 .avi
- CV_FOURCC(‘P’,‘I’,‘M’,‘1’),MPEG-1 编码格式,扩展名为 .avi
- CV_FOURCC( ‘X’,‘V’,‘I’,‘D’),MPEG-4 编码格式,扩展名为 .avi
- CV_FOURCC( ‘F’,‘L’,‘V’,‘I’),Flash 编码格式,件扩展名为 .flv
fps:视频流的帧速率
frameSize:元组 (w, h),视频帧的宽度和高度
isColor:是否彩色图像
2.2具体操作
1.读取视频文件,用VideoCapture来实例化对象获得视频源。
2创建写入视频路径,用VideoWriter实例化对象写入视频
3判断是否读取成功,并进行处理(这里还是用了抽帧处理)
4如果读取成功,可以在此过程中查看视频
5将处理后的帧写入视频文件
2.3小例子
#视频文件的读取、播放和保存
import cv2 as cv
# 创建视频读取/捕获对象
vedioRead = "videos/g.mp4" # 读取视频文件的路径
capture = cv.VideoCapture(vedioRead) # 实例化 VideoCapture 类
# 查看视频图像的高,宽,帧速率和总帧数
width = int(capture.get(cv.CAP_PROP_FRAME_WIDTH)) # 960
height = int(capture.get(cv.CAP_PROP_FRAME_HEIGHT)) # 540
fps = round(capture.get(cv.CAP_PROP_FPS)) # 30
frameCount = int(capture.get(cv.CAP_PROP_FRAME_COUNT)) # 1826
print(height, width, fps, frameCount)
# 创建写入视频对象
# fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D') # 编码器设置 XVID
fourcc = cv.VideoWriter_fourcc(*'XVID') # 'X','V','I','D' 简写为 *'XVID'
vedioWrite = "videos/a_1.avi" # 写入视频文件的路径
capWrite = cv.VideoWriter(vedioWrite, fourcc, fps, (width, height), True)
# 读取视频文件,抽帧写入视频文件
frameNum = 0 # 视频帧数初值
timef = 10 # 设置抽帧间隔
while capture.isOpened(): # 检查视频捕获是否成功
# capture.set(cv2.CAP_PROP_POS_FRAMES, frame_indesx)
ret, frame = capture.read() # 读取下一帧视频图像
if ret is True:
#显示捕获的帧画面
frameNum += 1 # 读取视频的帧数
cv.namedWindow("frame", 0)
cv.resizeWindow("frame", 700, 1200)
cv.imshow('frame', frame)
#cv.imshow(vedioRead, frame) # 播放视频图像
if (frameNum % timef == 0): # 判断抽帧条件
capWrite.write(frame) # 将当前帧写入视频文件
if cv.waitKey(10) & 0xFF == ord('q'): # 按 'q' 退出
break
else:
print("Can't receive frame at frameNum {}".format(frameNum))
break
capture.release() # 关闭读取视频文件
capWrite.release() # 关闭视频写入对象
cv.destroyAllWindows() # 关闭显示窗口
在videos文件中会出现相应视频,如下(右边是原视频)
总结
视频处理本质还是图像处理,有很多对于图像的操作,视频也能用。本文只提出了最简单的处理,希望和大家一起学习交流进步。
文章来源:https://www.toymoban.com/news/detail-779826.html
文章来源地址https://www.toymoban.com/news/detail-779826.html
到了这里,关于用Python来进行简单的视频处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!