Python玩转视频系列(一)

浏览: 1122

本系列教程将分享如何用Python玩转视频处理,本文先介绍两个库opencvmoivepy及其简单使用。

1、opencv介绍及人脸识别

OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。

OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。

OpenCV主要用C++语言编写,Python程序可以通过Python-OpenCV这个库调用OpenCV的相关接口。

1.1 python-opencv的安装

使用pip install opencv-python命令进行安装,安装完成后运行python,导入cv2,命令如下:

>>> import cv2

如无报错,说明安装成功。

1.2 人脸识别原理及使用

opencv的功能非常强大,本文中主要介绍并使用其人脸识别功能,完整功能可参考opencv中文教程

OpenCV采用的是基于Haar的cascade分类器,它是一种机器学习方法。

基于Haar特征的cascade分类器是Paul Viola和 Michael Jone在2001年发表的论文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一种有效的物品检测方法。它是一种机器学习方法,通过许多正负样例中训练得到cascade模型,然后将其应用于其他图片。

针对不同的物体需要不同的分类器。OpenCV包含许多训练好的分类器,比如脸、眼、微笑等。这些分类器是XML文件,存储在库安装文件夹cv2下面的data目录中,使用时可以直接调取,也可从GitHub上下载。

使用OpenCV识别人脸的步骤:

  1. 初始化,导入cv2等Python库,加载分类器cascade文件;
  2. 图片预处理,读取图片,使用cvtColor函数将图片转为灰度图;
  3. 人脸检测,使用detectMultiScale方法检测图片中的人脸。

比如这里需要从下图中识别人脸。

imgimg

代码如下:

import numpy
import cv2


# haarcascade_frontalface_default.xml复制到当前目录下
# 或者指定该文件的完整路径
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

# 读取图片,使用*cvtColor*函数将图片转为灰度图
img = cv2.imread("girl.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用detectMultiScale方法检测图片中的人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

# 将人脸部分用长方形表示
print(faces)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)

# 保存结果
cv2.imwrite('result.jpg',img)

效果如下:

imgimg

2、moviepy介绍及视频截取

moviepy是一个用于视频编辑的python模块,其可以用来对视频进行一些基础的操作(比如剪切,连接,插入标题等),视频创作(比如非线性编辑),视频处理以及给视频增加一些炫酷的特效等。它可以读写大多数常见的视频格式,包括GIF。

在之前的文章中使用moviepy从视频中截取片段生成gif表情(用Python从视频中生成动态表情)。

这里介绍一个另一个从视频中截取片段的方法,可以提升处理性能。一个基于ffmpeg的方法,使用ffmpeg_extract_subclip来处理视频,方法如下:

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip

ffmpeg_extract_subclip("full.mp4", 60, 300, targetname="cut.mp4")

其实这个方法就是调用ffmpeg命令处理视频,源代码如下:

def ffmpeg_extract_subclip(filename, t1, t2, targetname=None):
""" Makes a new video file playing video file ``filename`` between
the times ``t1`` and ``t2``. """
name, ext = os.path.splitext(filename)
if not targetname:
T1, T2 = [int(1000*t) for t in [t1, t2]]
targetname = "%sSUB%d_%d.%s" % (name, T1, T2, ext)

cmd = [get_setting("FFMPEG_BINARY"),"-y",
"-ss", "%0.2f"%t1,
"-i", filename,
"-t", "%0.2f"%(t2-t1),
# "-map", "0", "-vcodec", "copy", "-acodec", "copy", targetname]
"-vcodec", "copy", "-acodec", "copy", targetname]

subprocess_call(cmd)

基于上面的方法就可以实现后面的功能,关于moviepy的完整教程可参考moivepy官网,在下一篇中将分享如何从视频中提取女神片段

推荐 0
本文由 101python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册