我对Haarcascade的理解
keywords:哈尔变换,Adaboost,决策树,随机森林,级联
当面对一个图像时,计算机找人脸的方法会有些不同。在计算机眼里,一个图片就是一堆的像素点,每个像素点都是一个矩阵,里面可以存放着RGB值也可以是存放在着灰度值。我们把一个物体定为特征,通常是这个物体在这幅图像上,与背景或是与周围的环境有边缘,也可以把边缘看作是图像的断层。有的断层窄而明显(一般Photoshop抠起来很容易),而有些却宽又浅。不管怎样,在正确地指引以及大量的样本下,计算机总可以将特征识别,Haar变换是如何在其中发挥作用的呢?
哈尔小波变换有一个特点,它对于瞬间震荡的曲线十分敏感。也就是说它可以被用来捕获图像中的特征量。可是这样虽然捕捉到了但是一张图片有颜色差异的部分多得一匹,怎么才能让它准确地识别到我需要的物体呢?
决策树在这时发挥了作用,在机器学习的过程中,她(计算机)看到很多2深度的树桩堆叠起来的决策树,也会看到很多这样的决策树排列形成的随机森林。这对于她来说就像在探险一样,她在树枝上穿行,最终她会找到一条路,通向我们想要的特征。可是,一个特征可以建立起的随机森林实在太大,这会增加她寻找的时间,她甚至会在其中迷失。所以,在建立决策树时就应该把一些明显不符的树枝及时删去不让它再生长下去,这就是Adaboost算法。这个算法会在学习过程中将自己不感兴趣的决策树子叶直接裁剪,放入排除区不让其生长。这将加快学习的速度。此外Haarcascade还用到了积分图,那是更快地从一张图片上匹配到特征的算法。
Haarcascade的翻译是“哈尔级联”,以哈尔命名自然是因为哈尔小波变换。而级联是什么呢?我的理解很浅,我认为它就是分类,在机器学习中,每一颗决策树就像是一个级联。在各种的文件中,它把以Haar得到的特征分成脸部、眼睛、嘴巴…
机器视觉是人工智能的眼睛,算法让它动了起来。
流程图
关键的语句
捕获:cap = cv2.VideoCapture(0)
cap即为一帧的图像
灰度处理:gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Haarcascade被设计成依靠灰度值判断特征,而不是RGB。(这样更快)
匹配特征所在矩形:
Scan = face.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3)
程序
这里加入了一个返回图像中心点的功能,方便以后用来写摄像头面部跟随的程序。
import cv2
import numpy
def init():
if cap.isOpened():
res, img = cap.read()
h,w,k = img.shape
return h/2,w/2
def Done():
while cap.isOpened():
res, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Scan = face.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3) # detectMultiScale(图片,前后两个窗口的比例系数,组成检测目标的相邻的最小比例系数。)
if len(Scan)>0:
for (x,y,w,h) in Scan:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) #依靠对角线来定矩形
print(x+w/2, y+h/2)
cv2.imshow("CaptureFace",img)
key = cv2.waitKey(50) & 0xff
if key == 27: #ESC的ASCALL码是27
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
cap = cv2.VideoCapture(0)
face = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
cx,cy = init()
print("中心:",end=' ')
print(cy,cx)
Done()