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

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识别人脸的步骤:初始化,导入cv2等Python库,加载分类器cascade文件;

图片预处理,读取图片,使用cvtColor函数将图片转为灰度图;

人脸检测,使用detectMultiScale方法检测图片中的人脸。

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

img

代码如下:

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)

效果如下:

img

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官网,在下一篇中将分享如何从视频中提取女神片段