前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python将视频抽帧的的多种方式

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

原创
作者头像
JQ实验室
发布2022-09-29 10:02:53
2.9K0
发布2022-09-29 10:02:53
举报
文章被收录于专栏:实用技术

最近有一个需求是将视频抽取为一个个的帧图片,使用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('裁剪完成...')

```

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档