本系列教程:Python玩转视频处理之opencv和moviepy介绍与简单使用
本系列教程会分享怎样用Python进行视频处理,在本文中,会先介绍opencv和moivepy这两个库,还会介绍它们的简单使用方法。

1、opencv介绍及人脸识别
OpenCV全称为Open Source Computer Vision Library,它是一个跨平台的计算机视觉库,由英特尔公司发起并参与开发,以BSD许可证授权发行,能在商业和研究领域免费使用。
OpenCV能够用来开发程序,这些程序涉及实时的图像处理,还涉及计算机视觉,也涉及模式识别。
OpenCV主要是用C++语言来编写的,Python程序能够借助Python-OpenCV这个库来调用OpenCV的相关接口。
1.1 python-opencv的安装
使用pip install opencv-python这个命令来进行安装,安装结束后运行python,接着导入cv2,命令如下:
>>> import cv2
如无报错,说明安装成功。
1.2 人脸识别原理及使用
opencv具备十分强大的功能,在本文里,主要对其人脸识别功能加以介绍并予以使用,其完整功能可供参考
OpenCV采用的是基于Haar的cascade分类器,这种分类器是一种机器学习方法。Paul Viola和Michael Jone在2001年发表的论文“Rapid Object Detection using a Boosted Cascade of Simple Features”中提出了一种有效的物品检测方法,该方法是基于Haar特征的cascade分类器。它属于机器学习方法,借助众多正负样例来训练,从而得到cascade模型,之后把该模型应用到其他图片上。
针对不同物体,需要不同的分类器。OpenCV包含许多训练好的分类器,像脸、眼、微笑等。这些分类器是XML文件,存储在库安装文件夹cv2下面的data目录中,使用时能直接调取,也可从
使用OpenCV识别人脸有以下步骤,首先要进行初始化,接着要导入cv2等Python库,最后要加载分类器cascade文件。
进行图片预处理,读取图片,运用cvtColor函数把图片转换为灰度图;
进行人脸检测时,会运用detectMultiScale方法,该方法用于检测图片里的人脸。
比如这里需要从下图中识别人脸。
代码如下:
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从BGR颜色空间转换为灰度颜色空间得到的结果 。
运用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将img写入'result.jpg'文件中 。
效果如下:
2、moviepy介绍及视频截取
moviepy是一个用python编写的模块,可用于视频编辑,能对视频进行基础操作,如剪切、连接、插入标题等,还能进行视频创作,像非线性编辑,也可用于视频处理,以及给视频添加炫酷特效等,它能读写多数常见视频格式,包含GIF,在之前文章里曾用moviepy从视频截取片段生成gif表情
这里介绍一个能提升处理性能的从视频中截取片段的方法,这是一个基于ffmpeg的方法,该方法使用ffmpeg_extract_subclip来处理视频,具体如下:
从moviepy.video.io.ffmpeg_tools中导入ffmpeg_extract_subclip
使用ffmpeg_extract_subclip工具,从“full.mp4”文件中提取视频片段,提取的起始时间为60秒,结束时间为300秒,将提取后的视频片段保存为名为“cut.mp4”的文件。
其实这个方法就是调用ffmpeg命令处理视频,源代码如下:
定义一个函数,名为ffmpeg_extract_subclip,该函数有四个参数,分别是filename、t1、t2、targetname ,其中targetname参数的默认值为None 。
创建一个新的视频文件,该视频文件播放名为“filename”的视频文件,播放区间为
时间“t1”和“时间“t2” 。""" (此句英文表述不太完整准确,按要求改写后逻辑也较模糊,推测是尽量贴近原文形式改写)
将文件名进行路径分割,得到文件名和扩展名,分别存储在name和ext变量中 。
if not targetname:
T1等于对t1乘以1000后取整,T2等于对t2乘以1000后取整 。
targetname等于,由name、T1、T2、ext组成的字符串格式化后的结果,格式为%sSUB%d_%d.%s
cmd等于,获取设置的“FFMPEG_BINARY”,“-y”,
"-ss", "%0.2f"%t1,
"-i", filename,
"-t", "%0.2f"%(t2-t1),
把“-map”,“0”,“-vcodec”,“copy”,“-acodec”,“copy”,以及目标名称组合在一起
"-vcodec"参数的值为"copy","-acodec"参数的值为"copy",目标名称为targetname]
subprocess_call(cmd)
借助上面的方法,能够达成后面的功能,关于moviepy的完整教程可供参考 。
欢迎关注我的公众号“Python的乐趣”,原创的技术文章会在第一时间进行推送。