推荐答案
在 OpenCV 中进行人脸检测通常使用 Haar 级联分类器。以下是使用 OpenCV 进行人脸检测的示例代码:
// www.javascriptcn.com code example
import cv2
# 加载预训练的 Haar 级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取图像
image = cv2.imread('image.jpg')
# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 在图像上绘制检测到的人脸矩形框
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()本题详细解读
Haar 级联分类器
Haar 级联分类器是一种基于 Haar 特征的机器学习方法,用于目标检测。OpenCV 提供了多种预训练的 Haar 级联分类器,包括用于人脸检测的分类器。这些分类器通过训练大量正样本(包含目标的图像)和负样本(不包含目标的图像)来识别目标。
代码解析
加载 Haar 级联分类器:
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
这行代码加载了 OpenCV 自带的 Haar 级联分类器文件
haarcascade_frontalface_default.xml,该文件用于检测正面人脸。读取图像:
image = cv2.imread('image.jpg')使用
cv2.imread()函数读取图像文件。转换为灰度图:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
由于 Haar 级联分类器在灰度图像上工作得更好,因此将彩色图像转换为灰度图像。
检测人脸:
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
detectMultiScale()函数用于检测图像中的人脸。参数说明:scaleFactor:图像缩放比例,用于检测不同大小的人脸。minNeighbors:每个候选矩形应该保留的邻居数量,用于减少误检。minSize:人脸的最小尺寸。
绘制矩形框:
for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)使用
cv2.rectangle()函数在检测到的人脸周围绘制矩形框。显示结果:
cv2.imshow('Detected Faces', image) cv2.waitKey(0) cv2.destroyAllWindows()使用
cv2.imshow()显示检测结果,cv2.waitKey(0)等待用户按键,cv2.destroyAllWindows()关闭所有窗口。
注意事项
- Haar 级联分类器对光照、姿态和遮挡等因素较为敏感,因此在复杂场景下可能需要调整参数或使用更高级的检测方法。
- OpenCV 还提供了其他预训练的级联分类器,如眼睛、微笑等检测器,可以根据需要加载和使用。