如何进行人脸识别
首先我们下载的opencv库中就自带了这些方法,可以直接使用了。我们可以这样找到
1 找到我们的外部库
这个外部库site-packages中存着我们的第三方库,我们可以在这个里面找到我们的cv2
2 找到cv2中的data文件
date中就是我们的这些检测方法,其中包含了笑容检测,人脸检测,下半身,或者眼镜检测,等等等等。下面我们来使用一下人脸检测。
3 代码部分
import cv2# 读取图像文件
image = cv2.imread('img_2.png')# 将彩色图像转换为灰度图像,因为人脸检测通常在灰度图像上更高效
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 加载人脸识别分类器
# 使用OpenCV提供的预训练Haar级联分类器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 分类器检测实现人脸识别
# 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大小一致,则表示仅在一个尺度上查找目标
# objects: 返回值,目标对象的矩形框向量组。该值是一组矩形信息,
# 包含每个检测到的人脸对应的矩形框的信息(x轴方向位置、y轴方向位置、宽度、高度)
faces = faceCascade.detectMultiScale(gray,scaleFactor=1.05, # 缩放比例因子minNeighbors=9, # 最小邻居数,值越大检测越严格minSize=(8, 8) # 最小人脸尺寸
)# 输出检测结果
print("发现{0}张人脸!".format(len(faces)))
print("其位置分别是:", faces)# 标注人脸及显示结果
# 遍历所有检测到的人脸区域
for (x, y, w, h) in faces:# 在原始图像上绘制矩形框标注人脸# 参数说明:# image: 要绘制的图像# pt1: 矩形左上角坐标 (x, y)# pt2: 矩形右下角坐标 (x+w, y+h)# color: 矩形框颜色,这里使用绿色 (BGR格式)# thickness: 线条粗细cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示带有人脸标注的结果图像
cv2.imshow("result", image)# 等待按键输入,0表示无限等待
cv2.waitKey(0)# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
结果展示
4 参数解释
参数名 | 数据类型 | 作用说明 | 常见取值/建议 |
---|---|---|---|
image | Mat | 输入图像。通常应为灰度图像以加快检测速度。 | gray_image |
objects | vector | 输出参数。用于存储检测到的目标矩形框(x, y, width, height)。 | 通常传入一个 vector<Rect> 变量来接收结果,Python 中是一个列表。 |
scaleFactor | double | 图像缩放因子。决定在图像金字塔中每次缩小的比例。 | 1.05~1.4。值越小(如 1.05),检测越细致慢速;值越大(如 1.3),检测越快但可能漏检。 |
minNeighbors | int | 最小邻居数。控制误检率,值越高检测越严格,但可能漏检真实目标。 | 3~6(默认),**≥8**(高可靠性要求)。值越高,误检越少,但漏检可能增加。 |
flags | int | 检测模式标志。用于指定检测过程的一些选项(新版 OpenCV 中很多已弃用或无效)。 | 0 (默认) 或 CASCADE_SCALE_IMAGE 。CASCADE_FIND_BIGGEST_OBJECT (只找最大目标)。 |
minSize | Size | 目标最小尺寸。小于此尺寸的检测目标将被忽略。 | 如 (30, 30) 。根据图像中目标预期的最小大小调整,可有效过滤小噪声。 |
maxSize | Size | 目标最大尺寸。大于此尺寸的检测目标将被忽略。 |
5 扩展
在此基础上,我们可以对视频的每一帧进行读取,如何对视频的每一帧进行人脸检测看是否有人脸,如何画出来,如何就可以实现视频中的人脸检测了。
6 原理简述
首先我们引入了几个特征,就卷积核一样,如何计算出特征值
特征值 = ∑特征区域中白色区域的像素值-黑色区域像素值
Haar特征反映的是图像的灰度变化
关于 Harr 特征中的矩形框,有如下 3 个变量:
• 矩形框位置: 矩形框要逐像素点地划过(遍历) 整个图像获取每个位置的特征值。
• 矩形框大小: 矩形的大小可以根据需要进行任意调整。
• 矩形框类型: 包含垂直、水平、对角等不同类型。
根据这样我们可以检测出一个人脸,这么多特征在检测人脸的时候是不是满足的特征数越多越好。所以minNeighbors这里就是我们要满足的最小特征数。这里还涉及了一个级联分类器
都满足这些,才被归类于人脸,如果不是就不归于人脸。