人脸识别
要实现人脸识别首先要判断当前图像中是否出现了人脸,这就是人脸检测。只有检测到图像中出现了人脸,才能据此判断这个人到底是谁。那么,如何实现人脸识别呢?
调用 OpenCV 中训练好的分类器实现人脸检测。OpenCV 提供了训练好的haar级联分类器,OpenCV 还提供了使用 HOG 特征(主要用于行人检测)和 LBP 算法的级联分类器。
- 分类器作用:这个分类器是通过机器学习算法训练得到的,能够识别出图像中与人脸特征相匹配的区域。
接下来,我们来尝试对以下照片进行人脸检测:
一、获取分类器
- 分类器作用:这个分类器是通过机器学习算法训练得到的,能够识别出图像中与人脸特征相匹配的区域。
如何获取分类器呢?在左边的工程中找到外部库“External Libraries”,找到site-packages包,接着找到我们安装的第三方库cv2,该库下的data中,保存着分类器:
- 路径:External Libraries/site-packages/cv2/data
二、代码实现
1. 图片预处理
使用cv2.cvtColor()函数将读取的彩色图片转换为灰度图。这是因为人脸检测算法通常在灰度图上运行得更快且更有效。
import cv2
image = cv2.imread('p1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
2. 加载人脸检测分类器
使用cv2.CascadeClassifier()函数加载预训练的人脸检测分类器。这个分类器是基于Haar特征的,文件名为**“haarcascade_frontalface_default.xml”**,它通常与OpenCV库一起提供。
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
3. 检测人脸
- detectMultiScale()函数:
faces = faceCascade.detectMultiScale(gray, scaleFactor, minNeighbors, minSize)
- 参数:
-- faces:该函数返回一个人脸区域的列表。每个区域由其左上角的坐标(x, y)、宽度w和高度h表示。
-- scaleFactor:控制图像尺寸减小的比例。
-- minNeighbors:表示每个候选矩形区域需要有多少个相邻的矩形区域来保留该区域。
-- minSize:定义了人脸可能的最小尺寸。
- 代码:
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=10, minSize=(8,8))
print("发现{0}张人脸!".format(len(faces)))
print("其位置分别是:", faces)
-------------
发现4张人脸!
其位置分别是: [[208 122 128 128]
[375 171 132 132]
[ 37 153 127 127]
[613 184 148 148]]
4. 标注人脸
使用cv2.rectangle()函数在原始图片上绘制绿色矩形框,标记出检测到的人脸位置。
for (x,y,w,h) in faces:
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("result",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
本篇介绍了如何对人脸进行人脸识别检测。就是利用已经训练好的分类器模型,直接进行加载利用,识别图片。