Python opencv haar文件返回的面部特征太多

Python opencv haar文件返回的面部特征太多,python,opencv,opencv3.0,haar-classifier,Python,Opencv,Opencv3.0,Haar Classifier,我在试着检测埃隆·马斯克斯的面部特征。现在它有点能,但我发现太多的眼睛、鼻子和嘴巴的特征。我不知道如何才能解决这个问题,只找到一套 我正在使用opencv提供的haar文件,对于鼻子和嘴巴,我在网上的某个地方找到了一些haar文件 haarcascade_frontalface_default.xml haarcascade_eye.xml 哈尔档案 class Filterize(object): def __init__(self, filterpath): sel

我在试着检测埃隆·马斯克斯的面部特征。现在它有点能,但我发现太多的眼睛、鼻子和嘴巴的特征。我不知道如何才能解决这个问题,只找到一套

我正在使用opencv提供的haar文件,对于鼻子和嘴巴,我在网上的某个地方找到了一些haar文件

haarcascade_frontalface_default.xml
haarcascade_eye.xml
哈尔档案

class Filterize(object):
    def __init__(self, filterpath):
        self.filterpath = filterpath
        self.haarpath = os.path.join(os.getcwd(), 'haar')
        self.face_cascade = cv2.CascadeClassifier(os.path.join(self.haarpath, 'face.xml'))
        self.eye_cascade = cv2.CascadeClassifier(os.path.join(self.haarpath, 'eye.xml'))
        self.nose_cascade = cv2.CascadeClassifier(os.path.join(self.haarpath, 'nose.xml'))
        self.mouth_cascade = cv2.CascadeClassifier(os.path.join(self.haarpath, 'mouth.xml'))

    def get_filter_facial_features(self):
        filter = cv2.imread(self.filterpath)
        grayscale_filter = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY)
        face = self.face_cascade.detectMultiScale(grayscale_filter, 1.3, 5)
        for x, y, w, h in face:
            cv2.rectangle(filter, (x, y), (x + w, y + h), (255, 0, 0), 2)
            roi_gray = grayscale_filter[y:y + h, x:x + w]
            roi_color = filter[y:y + h, x:x + w]
            eyes = self.eye_cascade.detectMultiScale(roi_gray, 1.3, 5)
            nose = self.nose_cascade.detectMultiScale(roi_gray, 1.3, 5)
            mouth = self.mouth_cascade.detectMultiScale(roi_gray, 1.3, 5)
            for eye_x, eye_y, eye_w, eye_h in eyes:
                cv2.rectangle(roi_color, (eye_x, eye_y), (eye_x + eye_w, eye_y + eye_h), (0, 255, 0), 2)
            for nose_x, nose_y, nose_w, nose_h in nose:
                cv2.rectangle(roi_color, (nose_x, nose_y), (nose_x + nose_w, nose_y + nose_h), (0, 255, 0), 2)
            for mouth_x, mouth_y, mouth_w, mouth_h in mouth:
                cv2.rectangle(roi_color, (mouth_x, mouth_y), (mouth_x + mouth_w, mouth_y + mouth_h), (0, 255, 0), 2)
            cv2.imwrite('face.png', filter)
要创建照片,请执行以下操作:

a = Filterize(filterpath)
a.get_filter_facial_features()

在这行中:

face = self.face_cascade.detectMultiScale(grayscale_filter, 1.3, 5)
您可以传入以下可用参数(取自):

参数:

  • 级联–Haar分类器级联(仅限OpenCV 1.x API)。可以使用Load()从XML或YAML文件加载它。当级联未被激活时
    如果需要,请使用
    cvReleaseHaarClassifierCascade(&cascade)
  • 图像–CV_8U类型的矩阵,包含检测到对象的图像。对象–矩形向量,其中每个 矩形包含检测到的对象
  • scaleFactor–指定在每个图像比例下图像大小减小多少的参数
  • minNeighbors–指定每个候选矩形必须保留多少邻居的参数

  • flags–对于旧级联具有与函数cvHaarDetectObjects中相同含义的参数。它不用于新的级联

  • minSize–可能的最小对象大小。小于该值的对象将被忽略

  • maxSize–可能的最大对象大小。大于该值的对象将被忽略
此函数所做的是检测所有具有定义边界的特征。我建议您需要使用这些值,直到矩形的数量达到可接受的数量

事实上,maxSize看起来是一个很好的开始,因为每次检测都有较小的矩形