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

总结

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

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中,可以使用许多库来处理视频和图像,其中最常用的是OpenCV和Pillow。 OpenCV是一种专门用于计算机视觉的开源库,可以用于处理图像和视频。它支持许多算法和技术,包括边缘检测、图像分割、物体识别、运动跟踪等等。 Pillow是Python Imaging Library的一个分支,是一个Python库,用于处理图像。它可以打开、保存和操作多种不同格式的图像,并且提供了很多有用的图像处理功能,如尺寸调整、裁剪、旋转、滤镜等。 下面是使用OpenCV视频进行处理的一个例子,它将从摄像头中捕获视频,将其转换为灰度图像,并在窗口中显示: ``` python import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('frame', gray) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 这个例子中,我们首先使用cv2.VideoCapture()函数创建一个VideoCapture对象,它可以从摄像头、文件或网络摄像头捕获视频。然后我们使用while循环不断读取视频帧,将其转换为灰度图像,并在窗口中显示。最后,我们使用cv2.waitKey()等待按下“q”键来退出程序,释放资源并关闭所有窗口。 如果要使用Pillow来处理图像,可以使用以下代码来打开、调整大小并保存一张图片: ``` python from PIL import Image # 打开图片 im = Image.open('test.jpg') # 调整尺寸 im_resized = im.resize((300, 300)) # 保存图片 im_resized.save('test_resized.jpg') ``` 这个例子中,我们首先使用Image.open()函数打开一张图片,然后使用resize()函数调整其大小为300x300像素,并使用save()函数将其保存为一个新的文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值