完整代码一览

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 会返回所有符合条件的目标)。如果你的图片中有多个人,程序会自动画出所有矩形框。
在这里插入图片描述

Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐