一、haar分类器用于人脸检测的几个关键点:
1. Haar-like 特征 2. Haar-like特征的计算—积分图 3. 计算Haar特征值 4. Haar特征值归一化(也可标准化) 5. Adaboost级联分类器 (人脸训练 + 检测)二、几个比较好的博客介绍:
人脸检测之Haar分类器
集成学习adboost详解
opencv关于haar人脸检测的官方文档
三、通俗的理解haar分类器用于人间检测的五大步骤
1、准备人脸、非人脸样本集; 2、计算特征值和积分图; 3、筛选出T个优秀的特征值(即最优弱分类器); 4、把这个T个最优弱分类器传给AdaBoost进行训练。 5、级联,也就是强分类器的强强联手。1、进入python安装过所有包的那个文件夹:
比如我的是 D:\XXX\XXX\python3.6/site-packages
2、选择cv2 文件夹 进入,在选择data文件夹进入:里边有很多的可用的一些opencv已经弄好了的方法。
3、 我们把如下两个文件复制到项目里备用(他们是用haar检测人脸,是opencv官方已经训练好的模型,直接调用) haarcascade_frontalface_default.xml, haarcascade_eye.xml
4、 上代码:
""" haar特征检测人脸(opencv) """ import cv2 import numpy as np haar_front_face_xml = 'xml_file/haarcascade_frontalface_default.xml' haar_eye_xml = 'xml_file/haarcascade_eye.xml' # 1.静态图像中的人脸检测 def StaticDetect(filename): # 创建1个级联分类器 加载1个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器. face_cascade = cv2.CascadeClassifier(haar_front_face_xml) # 加载图像 img = cv2.imread(filename) # 转换为灰度图 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 人脸检测:scaleFactor,minNegihbors,分别表示人脸检测过程中每次迭代时图像的压缩率以及 # 每个人脸矩形保留近似数⽬的最⼩值 # 返回人脸矩形数组 faces = face_cascade.detectMultiScale(gray_img, 1.3, 5) for (x, y, w, h) in faces: # 在原图像上绘制矩形 img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) cv2.namedWindow('Face Detected!') cv2.imshow('Face Detected!', img) cv2.waitKey(0) cv2.destroyAllWindows() # 视频中的人脸检测 def DynamicDetect(): ''' 打开摄像头,读取帧,检测帧中的人脸,扫描检测到的人脸中的眼睛,对⼈脸绘制蓝蓝色的矩形框,对人眼绘制绿⾊的矩形框 ''' # 创建1个级联分类器 加载1个 .xml 分类器⽂件. 它既可以是Haar特征也可以是LBP特征的分类器. face_cascade = cv2.CascadeClassifier(haar_front_face_xml) eye_cascade = cv2.CascadeClassifier(haar_eye_xml) # 打开摄像头 camera = cv2.VideoCapture(0) cv2.namedWindow('Dynamic') while True: # 读取1帧图像 ret, frame = camera.read() # 判断图片读取成功? if ret: gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 人脸检测 faces = face_cascade.detectMultiScale(gray_img, 1.3, 5) for (x, y, w, h) in faces: # 在原图像上绘制矩形 cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = gray_img[y:y + h, x:x + w] # 眼睛检测 eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40, 40)) for (ex, ey, ew, eh) in eyes: cv2.rectangle(frame, (ex + x, ey + y), (x + ex + ew, y + ey + eh), (0, 255, 0),2) cv2.imshow('Dynamic', frame) # 如果按下q键则退出 if cv2.waitKey(100) & 0xff == ord('q'): break camera.release() cv2.destroyAllWindows() if __name__ == '__main__': filename = 'data/mayun.jpg' # StaticDetect(filename) DynamicDetect()!!! 需要注意的是: xml文件 和 图片路径 要写对,不然会报错。
5、运行效果:
(1)静态图片检测人脸,详见主函数调用的 StaticDetect(filename)方法
原图 ----->
结果图 (把大佬们的人脸,都检测出来了 - - ) -------->
(2)视频中实时检测人脸:详见主函数调用的 DynamicDetect() 方法
运行效果 (本人噢 检测人脸和眼睛 哈哈哈) 由于是晚上,光线不太好 ------->
https://github.com/datawhalechina/team-learning/blob/master/03 计算机视觉/计算机视觉基础:图像处理(下)/Task03 Haar特征描述算子.md