opencv对象检测之Haar分类器面部检测

1.原理

以Haar 特征分类器为基础的对象检测技术是一种非常有效的对象检测技术(2001 年Paul_Viola 和Michael_Jones 提出)。它是基于机器学习的,通过使用大量的正负样本图像训练得到一个cascade_function,最后再用它来做对象检测。

2.opencv中的Haar分类器

OpenCV 自带了训练器和检测器。OpenCV 已经包含了很多已经训练好的分类器,其中包括:面部,眼睛,微笑等。这些XML 文件保存在/opencv/data/haarcascades/文件夹中。

代码速记:

  • cv2.CascadeClassifier()
  • face_cascade.detectMultiScale()
  • eye_cascade.detectMultiScale()

参数解释:

cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
  • scaleFactor :指定每个图像比例缩小多少
  • minNeighbors: 指定每个候选矩形必须保留多少个邻居。
  • minSize:最小可能的对象大小。小于此值的对象将被忽略。
  • maxSize:最大可能的对象大小。大于此值的对象将被忽略。

  • 函数功能:检测输入图像中不同大小的对象。
  • 返回值:检测到的对象将作为Rect对象返回。

实战:

def classify(self):
    copy=self.img.copy()
    #【1】加载XML分类器
    face_cascade = cv2.CascadeClassifier('E:\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('E:\opencv\sources\data\haarcascades\haarcascade_eye.xml')
    #【2】以灰度格式加载输入图像或视频
    gray = cv2.cvtColor(copy, cv2.COLOR_BGR2GRAY)
    #【3】在图像中检测面部。如果检测到面部,会返回面部所在区域Rect(x,y,w,h)。
    #       一旦获得这个位置,我们可以创建一个ROI并在其中进行眼部检测。
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)#img、ScaleFactor、minNeighbors
    for (x, y, w, h) in faces:
        #画脸(彩色图像)
        copy = cv2.rectangle(copy, (x, y), (x + w, y + h), (255, 0, 0), 2)
        #确定脸部ROI
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = copy[y:y + h, x:x + w]
        #【4】检测眼睛(灰度图像)
        eyes = eye_cascade.detectMultiScale(roi_gray)#img、ScaleFactor、minNeighbors
        for (ex, ey, ew, eh) in eyes:
            #画眼睛(彩色图像)
            cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
    titles = ['raw', 'faces&eyes']
    imgs = [self.img,copy]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(cv2.cvtColor(imgs[i],cv2.COLOR_BGR2RGB))
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值