Python基于Haarcascade的人脸检测

我对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()
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A: 人脸检测是计算机视觉中的一个基本任务,Adaboost算法是一种常用的分类算法,具有高精度和有效性。使用Python语言实现基于Adaboost算法的人脸检测可以通过以下步骤完成: 1. 准备训练数据集,可以使用已有的人脸数据集,如LFW和FDDB等。 2. 根据学习算法选择提取特征,特征应该具有区分度。 3. 使用Adaboost算法训练分类器,并选取分类器的阈值。 4. 对测试数据进行分类,可以利用滑动窗口的方法将图像分成多个小块,然后通过分类器判断每个小块是否是人脸。 下面是一个简单的示例代码: ```python import cv2 # 加载分类器 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 打开图像文件 img = cv2.imread('test.jpg') # 转化成灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用分类器进行人脸检测 faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 显示结果 for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在此示例代码中,我们使用OpenCV库提供的haar分类器进行人脸检测。首先通过`CascadeClassifier`加载分类器文件,然后通过`detectMultiScale`方法进行人脸检测。`detectMultiScale`方法返回一个由检测到的人脸矩形框的位置和大小组成的元组。最后使用`rectangle`方法在原图像上绘制人脸矩形框。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值