用Python来进行简单的视频处理

您所在的位置:网站首页 python多线程读取处理音频 用Python来进行简单的视频处理

用Python来进行简单的视频处理

2023-06-22 18:33| 来源: 网络整理| 查看: 265

前言

         本质上视频是由一张张图像组成,视频处理建立在图像处理之上,视频每一帧就是一张图像。首先需要配置好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]]) →

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文件中会出现相应视频,如下(右边是原视频)

总结

        视频处理本质还是图像处理,有很多对于图像的操作,视频也能用。本文只提出了最简单的处理,希望和大家一起学习交流进步。  

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3