python将视频抽帧的的多种方式

2022-09-29 10:02:53 浏览数 (1)

最近有一个需求是将视频抽取为一个个的帧图片,使用python很方便实现,而且有多种方式;

#### 视频转换为帧的三种方式

**第一种:使用open-cv**

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法;

由于open-cv不是python的内置库,所以使用之前需要先安装;

安装方式推荐有很多种,推荐使用pip;

>pip 是 Python 的包安装程序。其实,pip 就是 Python 标准库(The Python Standard Library)中的一个包,只是这个包比较特殊,用它可以来管理 Python 标准库(The Python Standard Library)中其他的包。pip 是一个命令行程序。 安装 pip 后,会向系统添加一个 pip 命令,该命令可以从命令提示符运行。

使用pip安装,打开命令行输入;

> pip install open-cv

等待执行安装成功;

安装完成后,导入:

>import cv2

**需要注意的是,安装的库名称和导入的名称不一样**

**1. 开始编码:**

具体思路是:

使用cv2中的VideoCapture函数加载视频,然后按帧读取,使用read方法;

```

vidcap = cv2.VideoCapture(video_path)

success, image = vidcap.read()

```

read方法返回两个参数,一个是读取结果是否成功,一个是图片帧;

读取结果为True,则保存图片帧为图片,需要使用cv2.imwrite方法,代码如下:

```

if success:

cv2.imwrite("frame_{0:0>3}.png".format(count), image)

if cv2.waitKey(10) == 27:

break

count = 1

```

累加count,方便计数;

使用open-cv保存图片完成;

**第二种:使用moviepy和PIL**

> moviepy是python中处理视频的常用库

> PIL是python中处理图片的常用库;

> 两个库都是第三方库,使用前需要安装;

使用pip安装moviepy和PIL

分别输入安装命令,打开命令行窗口,执行:

> pip install moviepy

> pip install Pillow

Pillow 是 PIL 的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等

pyhon3一般使用的都是pillow;

安装完成后导入:

```

from moviepy.editor import *

from PIL import Image

```

* 使用方法:

使用moviepy中的VideoFileClip函数加载视频信息,

使用iter_frames方法获取到每一帧

使用Image函数将每一帧转换为图片

* 具体代码如下:

```python

from moviepy.editor import *

from PIL import Image

def v2pngs(videofile,out_path):

"""

将视频保存为图片

"""

video_clip = VideoFileClip(videofile)

if not os.path.exists(out_path):

os.makedirs(out_path)

for idx, frame in enumerate(video_clip.iter_frames()):

print(">>>idx: ", idx)

if idx % 5 > 0:

continue

filename = out_path '/img_' str(int(idx/5)).zfill(3) ".png"

Image.fromarray(frame).save(filename)

video_clip.close()

print("Done!")

```

**使用FFmpeg抽帧**

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序;

使用ffmpeg命令可以很快的抽取视频帧;

python在使用ffmpeg命令时,只需要调用内置库os;

> os.system('ffmpeg -***")

使用os.system执行命令行窗口命令;具体抽帧函数,可以参考ffmpeg官网命令;

---

在抽取视频帧时,有时需要获取指定分辨率的图片,那就需要先裁减原视频,ffmpeg实现此功能最方便;

**使用FFmpeg裁剪视频**

使用ffmpeg裁剪视频时的命令如下:

> ffmpeg -i video_path -vf crop=405:720:440:0 out_path

关键参数crop,输入(x,y,width,height) 左上角坐标,宽度和高度四个参数

具体代码如下:

```bash

#! _*_ coding:utf-8 _*_

import os

def cropVideo(video_path,out_path):

'''裁剪视频'''

os.system('ffmpeg -i %s -vf crop=405:720:440:0 %s' % (video_path,out_path))

print('裁剪完成...')

```

0 人点赞