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()

在这里插入图片描述

发布了154 篇原创文章 · 获赞 45 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36622009/article/details/104828077