【深度学习】OpenCV 人脸检测实战:使用 Haar 级联分类器实现人脸识别
·
完整代码一览
import cv2
image = cv2.imread('peop.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# ----------------加载分类器----------------
xml_file = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(xml_file)
# ----------------分类器检测实现人脸识别 ----------------
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=3, minSize=(8, 8))
print("发现{}张人脸!".format(len(faces)))
print("其位置分别是:", faces)
# ----------------标注人脸及显示 ----------------
for (x, y, w, h) in faces:
cv2.rectangle(image, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2)
cv2.imshow("result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
读取图像并灰度化
import cv2
image = cv2.imread('peopel.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
人脸检测器通常工作在灰度图像上,因为灰度图能减少计算量,而且 Haar 特征是基于亮度变化的,不依赖颜色。所以用 cvtColor 转为灰度图。
加载 Haar 级联分类器
xml_file = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"# 这是 正面人脸检测 的预训练模型。
faceCascade = cv2.CascadeClassifier(xml_file)# 加载 XML 文件,生成一个级联分类器对象
cv2.data.haarcascades:这是 OpenCV 内置的 Haar 级联分类器 XML 文件存放路径。不同版本的 OpenCV 路径可能不同,但用这个变量可以自动定位。
除了默认的人脸模型,OpenCV 还提供了其他模型,如眼部、微笑、猫脸等。你可以替换文件名试试效果。
执行人脸检测
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=3, minSize=(8, 8))
print("发现{}张人脸!".format(len(faces)))
print("其位置分别是:", faces)
objects = cv2.CascadeClassifier.detectMultiScale( image[, scaleFactor[ ,minNeighbors[ , flags[, minSize[ , maxSize]]]]] )
其中,各个参数及返回值的含义如下。
-
image:待检测图像,通常为灰度图像。
-
scaleFactor:表示在前后两次相继扫描中搜索窗口的缩放比例。识别,扫描,按照不同比例来进行扫描
-
minNeighbors:表示构成检测目标的相邻矩形的最小个数。在默认情况下,该参数的值为 3.表示有 3 个以上的检测标记存在时才认为存在人脸。如果希望提高检测的准确率可以将该参数的值设置得更大,但这样做可能会让一些人脸无法被检测到。
-
flags:该参数通常被省略。在使用低版本 OpenCV (OpenCV 1.X 版本)时,该参数可能会被设置CV_HAAR_DO_CANNY_PRUNING,表示使用 Canny 边缘检测器拒绝一些区域。
-
minSize:目标的最小尺寸,小于这个尺寸的目标将被忽略。
-
maxSize:目标的最大尺寸,大于这个尺寸的目标将被忽略。
若 maxSize 和 minSize 大小一致,则表示仅在一个尺度上查找目标。
返回值
- faces(objects ):一个包含所有检测到的人脸矩形框的 NumPy 数组,每个元素是 (x, y, w, h),分别代表矩形左上角的 x、y 坐标,以及宽度和高度。
绘制矩形框并显示结果
for (x, y, w, h) in faces:
cv2.rectangle(image, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2)
cv2.imshow("result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
拓展 —— 检测多张人脸
本代码直接支持多张人脸检测(因为 detectMultiScale 会返回所有符合条件的目标)。如果你的图片中有多个人,程序会自动画出所有矩形框。
更多推荐

所有评论(0)