【Python+OpenCV 人脸检测—CascadeClassifier 级联分类器实现】

一、CascadeClassifier—级联分类器

级联分类器:CascadeClassifier就是opencv下objdetect模块中用来做目标检测的级联分类器的一个类,它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别某个物体是否属于某个分类。以人脸为例,我们可以把眼睛、鼻子、眉毛、嘴巴等属性定义成一个分类器,如果检测到一个模型符合定义人脸的所有属性,那么就认为它是一个人脸。接下来我们就逐步实现。

1、导入分类器文件

我们这次实现的人脸识别功能,需要先导入一个后缀名为.xml的分类器文件,它是前人已经创建好的分类器,我们可以直接使用
在这里插入图片描述
代码如下

faceCascade = cv2.CascadeClassifier("XML/haarcascade_frontalface_default.xml")

2、读入图片

img1 = cv2.imread('Photos/MHT.png')

3、转为灰度图

imgGray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

4、调用detectMultiScale()函数进行检测

face1 = faceCascade.detectMultiScale(imgGray1, 1.1, 4)

detectMultiScale(image, scaleFactor, minNeighbors);
对参数我的理解是:

image:待处理的图像
scaleFactor:检测框的最小尺寸
minNeighbors:相当于检测的阈值,过小会出现误检现象,即把一些其他元素误判成人脸,过大可能会检测不到目标

函数输出的是检测到目标图片中的每个人脸的x、y坐标值和宽度、高度。

5、绘制矩形框标记人脸

for (x, y, w, h) in face1:
    cv2.rectangle(img1, (x, y), (x+w, y+h), (255, 0, 0), 2)

6、输出图像

cv2.imshow("Result1", img1)

二、运行效果

我们先拿一张照片试一下
在这里插入图片描述
把人数增加成三个人:
在这里插入图片描述
四个人:
在这里插入图片描述
人数再多一点试试:
在这里插入图片描述
可以看到,大部分的人脸都被检测出来了。在人数很多的情况下,有一个没有被检测到,但在简单的场景下还是能基本完成要求的。下面附上完整代码:

import cv2

faceCascade = cv2.CascadeClassifier("XML/haarcascade_frontalface_default.xml")
img1 = cv2.imread('Photos/MHT.png')
img2 = cv2.imread('Photos/Three.png')
img3 = cv2.imread('Photos/BLACKPINK.jpg')
img4 = cv2.imread('Photos/101.png')

imgGray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
imgGray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
imgGray3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)
imgGray4 = cv2.cvtColor(img4, cv2.COLOR_BGR2GRAY)

face1 = faceCascade.detectMultiScale(imgGray1, 1.1, 4)
face2 = faceCascade.detectMultiScale(imgGray2, 1.2, 4)
face3 = faceCascade.detectMultiScale(imgGray3, 1.3, 5)
face4 = faceCascade.detectMultiScale(imgGray4, 1.2, 8)

# print(face1)
# print('***************************************************')
# print(face2)
# print('***************************************************')
# print(face3)
# print('***************************************************')
# print(face4)

for (x, y, w, h) in face1:
    cv2.rectangle(img1, (x, y), (x+w, y+h), (255, 0, 0), 2)
for (x, y, w, h) in face2:
    cv2.rectangle(img2, (x, y), (x+w, y+h), (0, 255, 0), 2)
for (x, y, w, h) in face3:
    cv2.rectangle(img3, (x, y), (x+w, y+h), (0, 0, 255), 2)
for (x, y, w, h) in face4:
    cv2.rectangle(img4, (x, y), (x+w, y+h), (245, 148, 15), 2)

cv2.imshow("Result1", img1)
cv2.imshow("Result2", img2)
cv2.imshow("Result3", img3)
cv2.imshow("Result4", img4)
cv2.waitKey(0)


猜你喜欢

转载自blog.csdn.net/LPYchengxuyuan/article/details/122028669