1. 前言
人脸检测(Face Detection),就是给一幅图像,找出图像中的所有人脸位置,通常用一个矩形框框起来,输入是一幅图像img,输出是若干个包含人脸的矩形框位置。它是人脸识别的基础,人脸检测与人脸识别的主要区别在于人脸检测仅需要检测图片中的人脸位置,而人脸识别则是检测到人脸位置后,还需要与数据库中的人脸数据进行匹配,识别出检测到的人脸是属于哪个具体的人。本文基于OpenCV对人脸检测进行了实现与界面展示,后续会进一步更新关于人脸识别相关的功能开发。
下面是博主设计的简洁软件界面,能够实现图片、视频及摄像头的人脸检测功能,还提供了图片、视频检测结果保存功能。感兴趣的小伙伴可以自己试试。
觉得不错的小伙伴,感谢点赞、关注加收藏!如果大家有任何建议或意见,欢迎在评论区留言交流!
软件的初始界面如下图所示:
2. 软件效果演示
首先我们通过动图看一下人脸检测的实际效果,该软件主要实现的功能是对图片、视频和摄像头画面中的人脸位置进行检测,识别的结果可视化显示在界面和图像中,演示效果如下。
2.1 图片人脸检测
本软件可以通过自行选择图片文件进行人脸检测,点击图片选择按钮图标选择图片后,会直接显示人脸检测的结果:包括人脸数量、位置信息,可通过下拉选框查看单独某个人脸的检测结果,并且可以点击保存按钮,保存检测的结果图片。本功能的界面展示如下图所示:
2.2 视频人脸检测
本软件可以通过自行选择一段视频进行人脸检测,点击视频按钮可选择待检测的视频,软件会逐帧检测人脸情况,并将检测结果记录在下方的表格中,并且可以点击保存按钮,保存视频检测的结果。本功能的界面展示如下图所示:
2.3 摄像头人脸检测
在真实使用的场景中,我们往往利用设备摄像头获取实时画面,同时需要对画面中的人脸进行检测,因此本文同样实现了摄像头的人脸检测功能。点击摄像头按钮后即可开启摄像头,软件显示实时画面并开始检测画面中的人脸位置,本功能的界面展示如下图所示:
3. 人脸检测原理介绍
3.1 基本原理
人脸检测主要有两大类算法:基于知识和基于统计。
基于知识的方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。常用方法:模板匹配、人脸特征、形状与边缘
、纹理特性、颜色特征。
基于统计的方法则将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。常用方法:主成分分析与特征脸、神经网络方法、支持向量机、隐马尔可夫模型、Adaboost算法。
本文主要使用OpenCV的Haar分类器对人脸进行检测。Haar分类器实际上是Boosting算法的一个应用,Haar分类器用到了Boosting算法中的AdaBoost算法,只是把AdaBoost算法训练出的强分类器进行了级联,并且在底层的特征提取中采用了高效率的矩形特征和积分图方法。
Haar分类器算法的要点如下:
① 使用Haar-like特征做检测。
② 使用积分图(Integral Image)对Haar-like特征求值进行加速。
③ 使用AdaBoost算法训练区分人脸和非人脸的强分类器。
④ 使用筛选式级联把强分类器级联到一起,提高准确率。
3.2 使用Haar级联检测器对图片进行人脸检测
# coding:utf-8 import cv2 # 绘图展示 def cv_show(name,img): cv2.imshow(name, img) cv2.waitKey(0) cv2.destroyAllWindows() # 读取图片 img = cv2.imread('images/test1.jpg') # cv_show('img',img) # 转为灰度图 img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # cv_show('gray', img_gray) # 构造harr检测器 face_detector = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml') # 对图像中的人脸进行检测 detections = face_detector.detectMultiScale(img_gray,scaleFactor=1.3) # 解析并画出人脸方框 for x,y,w,h in detections: cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]])
参数说明:
image:待检测图片,一般为灰度图像加快检测速度
scaleFactor:设置一个缩小的比例,对图像进行逐步缩小来检测,这个参数设置的越大,计算速度越快,但可能会错过了某个大小的人脸。默认1.1,其实可以根据图像的像素值来设置此参数,像素大缩小的速度就可以快一点,通常在1~1.5之间。
minNeighbors:确定一个人脸框至少要有n个候选值 越高质量越好(默认为3)
minSize和maxSize用来限制得到的目标区域的范围大小。即人脸框的最大最小尺寸 如minSize=(40,40),表示人脸框最小不得小于40*40。
根据实际情况以及需求,可对以上几个参数进行调整,以达到最佳的检测效果。
基于上述原理,为了便于展示与学习。博主最终开发出了一套完整的UI界面可以对图片、视频及摄像头中的人脸进行检测,并对整个软件进行了详细测试。完整的UI界面、测试图片视频、代码文件,均已打包上传,感兴趣的朋友可以通过下载链接获取。
【获取方式】
本文涉及到的完整全部程序文件:包括python源码、UI文件等(见下图),获取方式见文末:
注意:该代码采用Pycharm+Python3.8开发,运行界面的主程序为
MainProgram.py
,测试图片脚本可运行img_test.py
;测试摄像头脚本可运行cameraTest.py
;测试视频脚本可运行videoTest.py
。为确保程序顺利运行,请按照requirements.txt配置Python依赖包的版本。