实现效果:写一个图形界面,实现输入一个视频,对视频中的人脸进行捕捉并输出。
技术基础
本文技术基础将分为三个部分介绍:
库 | 用途 |
---|---|
opencv | 视频处理模块 |
face_recognition | 人脸识别模块 |
tkinter | 窗口视窗设计模块 |
1.face_recognition
face_recognition是一个强大、简单、易上手的人脸识别开源项目,输入一张图像就可以确定人脸的位置。关于face_recognition的更多内容可以了解https://github.com/ageitgey/face_recognition。
下载
以下是我亲自尝试过的face_recognition库下载方法,都成功安装了:
- win10:最开始直接import face_recognition报错,发现Building wheel for dlib报错,也就是dlib的问题。然后pip install dlib仍然报错。发现和我的3.6版本有冲突。于是找到Windows系统安装dlib可直接在网站https://pypi.org/simple/dlib/ 下载3.6版本对应的whl文件,用pip安装。就是下载这个xxx.whl到一个目录,然后cd/d 该目录,pip install xxx.whl安装成功。再次pip install face_recognition即可。
- linux: 首先安装cmake
sudo wget https://cmake.org/files/v3.9/cmake-3.9.0-rc5.tar.gz -O cmake.tar.gz
sudo tar -xvf cmake.tar.gz
cd cmake-3.9.0-rc5/
sudo chmod +x bootstrap
sudo ./bootstrap
sudo make
sudo make install
安装好cmake后,输入
cmake -version
查看cmake版本是否安装成功。然后安装git来手动安装dlib
git clone https://github.com/davisking/dlib.git
cd dlib
mkdir build
cd build
cmake ..
最后安装face_recognition。
2.Opencv
Python的cv2库是一个在计算机视觉领域应用非常广泛的库,Python对于视频的读取、处理很多使用cv2库实现。
了解、安装cv2库可以参考Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略。在处理图像方面,cv2和其他几种常见的库例如PIL的用法很不一样,可以查看我的另一篇文章可以上Python PIL、cv2、Dataloader、plt读取/显示图像数据集对比实例。
v2使用有一些坑,例如三个通道的顺序是BGR而不是RGB,有时会报奇怪的错误其实就是图像路径没写对,等等。
3.tkinter
我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用户体验的。所有开发一个图像化的小窗口,就是必要的。
Tkinter 就是使用 python 进行窗口视窗设计的模块。Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。
作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,不需要另外下载。
参考:Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)
实现
以下给出本文的主要代码,完整代码见我的Github: GUI for video_face_recognition
视频处理部分
这一部分主要使用cv2库实现。
读取视频:
self.cap = cv2.VideoCapture(self.filename)
读取fps每秒传输帧数、视频时长(帧总数)
self.fps = self.cap.get(cv2.CAP_PROP_FPS)
self.total = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
设定从视频的第几帧开始读取
self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.start)
如果视频是竖着拍的,在cv2读取进去以后仍然是横向的,所以在人脸识别之前,需要旋转一下。(当然喵酱这些视频都是横着拍的就不用旋转了)
旋转图像代码:
##旋转图像
def rotate_bound(image,angle):
#获取图像的尺寸