1.人脸识别是个分类问题
- 人脸
- 不是人脸
2.OpenCV提供三种不同的训练级联分类器
通常的情况下,分类器会对多个图片特征进行识别,如一张【图】人脸识别图片1,图中有个可爱的小女孩和狗狗,
人可以一眼就是辨别出来,但计算机保存的是一组组像素文件RGB(0-255)的数组,如何让计算机识别是狗狗和人的图片,就需要进行不断的学习样本。
3.级联分类器
3.1 分类器原理
【图】级联分类原理图1,学过c或java的都知道的条件语句,级联分类器就是条件分支语句
开始,通过条件1,如果正确,继续,如果不正确,直接到符合条件的分类,如果满足条件1,继续判断,是否满足条件2,一层类推,直到最后判断条件为止,都满足条件,过滤出符合条件的分类值。
3.2Haar特征反映的图像灰度变化
- 矩形位置:矩形框要逐像素的划过整个图像的每个位置
- 矩形大小:矩形大小可以任意调整
- 矩形类型,可以垂直,水平,对角不同类型
选择红框是可以定义大小进行图像灰度处理
3.3 Haar的特征进一步划分
- 4个边特征
- 8个线特征
- 2个中心点特征
- 1个对角线特征
3.4 cv2的级联分类器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
使用级联分类器时需要注意:
3.5 源代码
import cv2 # 读取待检测的图像 image = cv2.imread('/Users/keny/Downloads/1.jpg') # 获取XML文件,加载人脸检测器 faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 色彩转换,转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 调用函数detectMultiScale faces = faceCascade.detectMultiScale( gray, scaleFactor = 1.15, minNeighbors = 5, minSize = (5,5) ) print(faces) # 打印输出的测试结果 print("是小女孩的脸吗?{0}!".format(len(faces))) # 逐个标注人脸 for(x, y, w, h) in faces: cv2.circle(image, (int((x+x+w)/2), int((y+y+h)/2)), int(w/2), (0,255,0),2) # 显示结果 cv2.imshow("dect", image) # 保存检测结果 cv2.imwrite("reface.jpg", image) cv2.waitKey(0) cv2.destroyAllWindows()
提示错误:
cascadedetect.cpp:1689: error: (-215:Assertion failed)
3.5.1错误提示解决方法
下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades
1.找到haarcascade_frontalface_default.xml等文件,点击进去.
2.找到Raw,右键链接(目标)另存为。