opencv-092-对象检测(HAAR特征介绍)

知识点

HAAR小波基函数,因为其满足对称性,对人脸这种生物对称性良好的对象特别适合用来做检测器,常见的Haar特征分为三类:

  • 边缘特征

  • 线性特征

  • 中心特征和对角线特征

不同特征可以进行多种组合,生成更加复杂的级联特征,特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和,Haar特征值反映了图像的对比度与梯度变化。
OpenCV中HAAR特征计算是积分图技术,这个我们在前面也分享过啦,所以可以非常快速高效的开窗检测, HAAR级联检测器具备有如下特性:

  • 高类间变异性
  • 低类内变异性
  • 局部强度差
  • 不同尺度
  • 计算效率高

代码(python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"""
对象检测(HAAR特征介绍)
"""
import cv2 as cv

capture = cv.VideoCapture(0)
face_detector = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_alt.xml")
smile_detector = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_smile.xml")

while True:
ret, image = capture.read()
if ret is True:
faces = face_detector.detectMultiScale(image, scaleFactor=1.05, minNeighbors=3,
minSize=(30, 30), maxSize=(300, 300))
for x, y, width, height in faces:
cv.rectangle(image, (x, y), (x + width, y + height), (0, 0, 255), 2, cv.LINE_8, 0)
roi = image[y:y + height, x:x + width]
smiles = smile_detector.detectMultiScale(roi, scaleFactor=1.7, minNeighbors=3,
minSize=(15, 15), maxSize=(100, 100))
for sx, sy, sw, sh in smiles:
cv.rectangle(roi, (sx, sy), (sx + sw, sy + sh), (0, 255, 0), 1)

cv.imshow("faces", image)
c = cv.waitKey(50)
if c == 27:
break
else:
break

cv.destroyAllWindows()

结果

代码地址

github