文章目录
- 一、人脸检测流程介绍
- 二、用于人脸检测的关键方法
- 1.加载分类器(cv2.CascadeClassifier())
- 2.检测图像中的人脸(cv2.CascadeClassifier.detectMultiscale())
- 三、代码实现
一、人脸检测流程介绍
- 下面是一张含有多个人脸的图片
- 第一步:读取图片后将图片转换成灰度图
- 第二步:在灰度图中进行特征检测,并检测出各个人脸的特征信息
- 第三步:将各个人脸的特征信息保存下来
- 第四部:根据检测出的人脸的特征信息,在原图中用矩形框,框出每个人的脸部区域
- 最终的结果如下:
二、用于人脸检测的关键方法
1.加载分类器(cv2.CascadeClassifier())
- 在OpenCV库中,提供了多个用于检测人脸的Haar特征的级联分类器,并以xml文件的形式存储,这些文件是预训练的,意味着它已经被训练好了,可以直接用于检测图像中的人脸
- 下面链接中是对人脸检测的Haar特征和级联分类器的介绍:
- https://blog.****.net/weixin_73504499/article/details/142883884?spm=1001.2014.3001.5501
-
如何找到这些xml文件呢?
- 这些 xml文件存在我们pycharm的环境中,通过下图中的步骤找到:
- 这些 xml文件存在我们pycharm的环境中,通过下图中的步骤找到:
- 找到这些文件后通过 cv2.CascadeClassifier() 加载分类器
- cv2.CascadeClassifier 是 OpenCV 库中用于加载和训练级联分类器的一个类
2.检测图像中的人脸(cv2.CascadeClassifier.detectMultiscale())
-
在OpenCV中,cv2.CascadeClassifier 类有一个非常重要的方法叫做 detectMultiScale(),这个方法专门用于在图像中检测对象。detectMultiScale() 方法会搜索图像中所有可能匹配预训练分类器(如Haar或LBP特征分类器)的对象,并返回这些对象的位置(通常以矩形框的形式)。
-
下面是 detectMultiScale() 方法的一些关键参数和它们的含义:
- image:要搜索的输入图像,通常是一个灰度图像(因为颜色信息对于Haar特征来说不是必需的,而且灰度图像处理起来更快)。
- scaleFactor:图像缩放的比例因子。在检测过程中,图像会按照这个比例因子逐步缩小,以便在不同的尺度上搜索对象。例如,scaleFactor=1.05 意味着每次迭代图像都会缩小5%。
- minNeighbors:每个候选矩形框需要有多少个相邻的矩形框来保留该框。这个参数有助于消除错误的检测。例如,如果设置为3,那么只有当至少有3个矩形框重叠时,该框才会被保留。
- flags:一些可选的标志,用于修改检测过程的行为。例如,cv2.CASCADE_SCALE_IMAGE 会告诉分类器在检测之前自动缩放图像(但通常这个标志是默认启用的,所以不需要显式设置)。
- minSize 和 maxSize:对象的最小和最大可能尺寸(以像素为单位)。这些参数可以帮助减少不必要的搜索区域,并加快检测速度。
- 返回值:detectMultiScale() 方法返回一个矩形框的列表(每个框都是一个 (x, y, w, h) 元组,其中 (x, y) 是矩形左上角的坐标,w 和 h 分别是矩形的宽度和高度)
三、代码实现
- 完整代码如下:
import cv2 """ 加载图片,并将图片转换为灰度图 """ image = cv2.imread('face.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) """ 加载分类器 """ # 'haarcascade_frontalface_default.xml' 用于检测正面人脸的Haar特征的级联分类器 faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') """ 使用分类器对人脸进行检测 """ faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=9, minSize=(8, 8)) print("发现{}张人脸".format(len(faces))) print("其位置分别是:", faces) """ 遍历每一个人脸的特征,并用矩形框将人脸部位框出 """ for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) """ 显示结果 """ cv2.imshow("result", image) cv2.waitKey(0) cv2.destroyAllWindows()
- 结果如下: