前言
本文主要介绍读取视频文件,保存视频帧图片;将帧图片合成为视频;读取视频文件,对视频帧图片进行心处理,将处理完的帧图片合成视频,以完成对视频的处理。
一、基本概念
视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在 1 秒内所出现的帧数,对应的英文是 FPS(Frames Per Second)。如果从视频中提取出独立的帧,可以使用图像处理的方法对其进行处理,达到处理视频的目的。
二、读取视频文件,保存视频帧图片
读取视频文件,保存视频帧图片,即将组成视频的一系列帧进行保存。
import os
import cv2
import numpy as np
# 分解视频图片
cap = cv2.VideoCapture(r'E:\work\aa.mp4')
is_opened = cap.isOpened()
print(is_opened)
# 获取视频属性
fps = cap.get(cv2.CAP_PROP_FPS) # 1s几张图片
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(fps, width, height)
i = 0
while is_opened:
if i == int(fps*2): # 获取2s帧图片
break
else:
i += 1
(flag, frame) = cap.read()
file_name = 'img' + str(i) + '.jpg'
file_path = r'C:\Users\ADMIN\Pictures\video\1' + os.sep + file_name
if flag:
cv2.imwrite(file_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 100])
print('end')
cap.release()
二、图片集合成为视频
img = cv2.imread(r'C:\Users\ADMIN\Pictures\video\1\img1.jpg') # 读取其中一张图片
img_info = img.shape
size = (img_info[1], img_info[0]) # 注意size的顺序
print(size)
# 写入对象创建 ,1s包括10张图片
video_write = cv2.VideoWriter(r'C:\Users\ADMIN\Pictures\video\1.mp4', -1, 10, size)
for i in range(1, 50):
file_name = r'C:\Users\ADMIN\Pictures\video\1\img' + str(i) + '.jpg'
img = cv2.imread(file_name, 1)
video_write.write(img)
# 写入对象关闭
video_write.release()
print('end')
注意:写入的图片要和size大小一样,行列顺序调换。写入对象的原型为:
< VideoWriter object> = cv2.VideoWriter( filename, fourcc, fps, frameSize[, isColor] )
其中filename为目标视频存放路径和名字,fourcc视频编/解码类型(此参数的用法可自行搜索,网上很多),fps为帧速率,frameSize为每一帧的长和宽,isColor表示是否为彩色图像,默认为True。
三、视频读取、处理、保存
视频处理实质就是对组成视频的一些列帧进行处理,即图像处理,图像的一系列处理方法皆可用于处理视频,也可以说视频处理是图像处理的另一种形式上的应用。文章来源:https://www.toymoban.com/news/detail-729123.html
import cv2
import numpy as np
cap = cv2.VideoCapture(r'E:\work\before.mp4')
# fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter(r'C:\Users\ADMIN\Videos\video\after.mp4', -1, 20, (1920, 1080))
# 读取视频帧并对其进行处理达到处理视频目的
while cap.isOpened():
ret, image = cap.read() # 读取帧`
if ret ==True:
img = cv2.Canny(image, 100, 200) # 边缘监测图
cv2.imshow('img', img)
#print(image.shape)
out.write(img)
c = cv2.waitKey(1) # 25
if c == 27:
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
PS: cv2.VideoWriter中的 fourcc参数据介绍将其设置为-1时,会弹出一个对话框,手动选择类型,经本人实验,设置为-1时没有对话框弹出,但不影响视频文件的生成。另外参数isColor设置为默认的Ture或手动设置为False也不影响视频文件的生成(因为cv2.Canny边缘检测结果为二值灰度图像)。文章来源地址https://www.toymoban.com/news/detail-729123.html
参考资料
- https://blog.csdn.net/weixin_43718675/article/details/102026385
- 李立宗 . opencv轻松入门:基于python.
到了这里,关于python视频基础处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!