2001年,Viola和Jones两位大牛发表了经典的《Rapid Object Detectionusing a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》,在AdaBoost算法的基础上,使用Haar-like小波特征和积分图方法进行人脸检测。他们设计了针对人脸检测更有效的特征,并对AdaBoost训练出的强分类器进行级联。这可以说是CV史上里程碑式的一笔了,也因此当时提出的这个算法被称为Viola-Jones检测器。随后这两位大牛将这个检测器进行了扩展,最终形成了OpenCV现在的Haar分类器。
因为Haar级联是在机器学习AdaBoost、Boosting的基础上提出的,由于我还没有学过机器学习,所以这部分的内容日后再描述,我将根据自己的理解浅显地解释一下
人脸五官有明显的区别。
例如:
so on…
而Haar就是一个人脸的模板,刚好可以契合人脸的图像特征
而这些特征,不会出现在其它物体上
多组弱分类器,通过不断分类,最终筛选出检测目标
多级弱分类器与一个强分类器的效果相似,但级联类似于条件概率
级联的弱分类器的复杂度逐渐增加来提高算法的识别准确度
优点:速度极快
缺点:
D:/opencv/CV/Haar/cascades/haarcascade_frontalface_default.xml
- haarcascade_frontalface_default.xml:检测面部
- haarcascade_eye.xml:检测左眼和右眼
- haarcascade_smile.xml:检测面部是否存在嘴部
- haarcascade_eye_tree_eyeglasses.xml:检测是否带墨镜
- haarcascade_frontalcatface.xml:检测猫脸
- haarcascade_frontalcatface_extended.xml:检测猫脸延伸
- haarcascade_frontalface_alt.xml:检测猫脸属性
- haarcascade_frontalface_alt_tree.xml
- haarcascade_frontalface_alt2.xml
- haarcascade_fullbody.xml:检测全身
- haarcascade_lefteye_2splits.xml:检测左眼
- haarcascade_licence_plate_rus_16stages.xml:检测证件
- haarcascade_lowerbody.xml:检测下半身
- haarcascade_profileface.xml
- haarcascade_righteye_2splits.xml:检测右眼
- haarcascade_russian_plate_number.xml:检测俄罗斯字母车牌号
- haarcascade_upperbody.xml:检测上半身
这些xml文件,其实就是机器学习中的模型
import cv2
import numpy as np
face_cascade = cv2.CascadeClassifier('D:/opencv/CV/Haar/cascades/haarcascade_frontalface_default.xml')
img = cv2.imread('face2.jpg')
img = cv2.resize(img,(720,720),interpolation=cv2.INTER_LANCZOS4)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.08,5)
for(x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('face',img)
cv2.waitKey()
cv2.destroyAllWindows()
xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定大小的检测窗口与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置。
然后滑动窗口,检测图像的另一个区域。
重复操作。由于输入的图像中特征大小不定,比如在输入图像中眼睛是25x25的区域,而训练时的是50x50,那么只有当输入图像增大到一半的时候,才能匹配上,所以这里还有一个逐步增大图像,也就是制作图像金字塔的流程。而每次增大的比例由scaleFactor
决定
face_cascade.detectMultiScale()
函数功能:检测目标,返回目标位置的四个顶点
输入参数:
- img:输入图像,灰度图运算速度更快
- scaleFactor:每次循环增大的比例
- minNeighbors:表示构成检测目标的相邻矩形的最小个数(默认为3个),数值越大人脸被筛选的难度越大,同样也越精确
- minSize=(120,120):小于这个范围的矩形,就不被认定为检测目标
示例:
faces = face_cascade.detectMultiScale(gray,1.08,5,minSize=(120,120))
import cv2
import numpy as np
face_cascade = cv2.CascadeClassifier('D:/opencv/CV/Haar/cascades/haarcascade_frontalface_default.xml')
camera = cv2.VideoCapture(0)
while(cv2.waitKey(1)==-1):
success,img = camera.read()
if success:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.08,5,minSize=(120,120))
for(x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('face',img)
cv2.destroyAllWindows()
(四十八)Haar级联检测器
haar分类器原理和opencv实现
使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测
opencv人脸检测_cascade.detectMultiScale参数详解
OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测
opencv人脸检测_cascade.detectMultiScale参数详解