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

前言

         本质上视频是由一张张图像组成,视频处理建立在图像处理之上,视频每一帧就是一张图像。首先需要配置好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文件中会出现相应视频,如下(右边是原视频)

总结

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

 

猜你喜欢

转载自blog.csdn.net/RZ_w99/article/details/131272871
今日推荐