Использование OpenCV detectMultiScale, чтобы найти мое лицо

Я уверен, что у меня есть общая тема правильно, но я не нахожу никаких лиц. Мой код читается из c=cv2.VideoCapture(0), т. е. видеокамера компьютера. Затем у меня есть следующая настройка, чтобы дать, где находятся лица. Как вы можете видеть, я просматриваю различные scaleFactors и minNeighbors, но rects всегда возвращается пустым. Я также пробовал каждый из четырех различных xml-файлов haarcascade, включенных в пакет opencv/data/haarcascades.

какие-либо советы?

while(1):
    ret, frame = c.read()
    rects = find_face_from_img(frame)

def detect(img, cascade):
    for scale in [float(i)/10 for i in range(11, 15)]:
        for neighbors in range(2,5):
            rects = cascade.detectMultiScale(img, scaleFactor=scale, minNeighbors=neighbors,
                                             minSize=(20, 20), flags=cv2.cv.CV_HAAR_SCALE_IMAGE)
            print 'scale: %s, neighbors: %s, len rects: %d' % (scale, neighbors, len(rects))

def find_face_from_img(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.equalizeHist(gray)
    rects = detect(gray, cascade)

1 ответов


Я немного изменил ваш код, чтобы он работал на моем компьютере. Когда я бегу, я получаю результаты

import cv2
import cv2.cv as cv
import getopt, sys

def detect(img, cascade):
    for scale in [float(i)/10 for i in range(11, 15)]:
        for neighbors in range(2,5):
            rects = cascade.detectMultiScale(img, scaleFactor=scale, minNeighbors=neighbors,
                                             minSize=(20, 20), flags=cv2.cv.CV_HAAR_SCALE_IMAGE)

            print 'scale: %s, neighbors: %s, len rects: %d' % (scale, neighbors, len(rects))


def find_face_from_img(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.equalizeHist(gray)
    rects = detect(gray, cascade)


if __name__ == '__main__':

    args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=', 'nested-cascade='])
    try: video_src = video_src[0]
    except: video_src = 0
    args = dict(args)


    cascade_fn = args.get('--cascade', "cascades/haarcascade_frontalface_alt.xml")
    cascade = cv2.CascadeClassifier(cascade_fn)

    c=cv2.VideoCapture(0)
    while(1):
        ret, frame = c.read()
        rects = find_face_from_img(frame)
        if 0xFF & cv2.waitKey(5) == 27:
                break

выход:

scale: 1.2, neighbors: 2, len rects: 1
scale: 1.2, neighbors: 3, len rects: 1
scale: 1.2, neighbors: 4, len rects: 1
scale: 1.3, neighbors: 2, len rects: 1
scale: 1.3, neighbors: 3, len rects: 1
scale: 1.3, neighbors: 4, len rects: 0
scale: 1.4, neighbors: 2, len rects: 1
scale: 1.4, neighbors: 3, len rects: 0
scale: 1.4, neighbors: 4, len rects: 0
scale: 1.1, neighbors: 2, len rects: 1
scale: 1.1, neighbors: 3, len rects: 1
scale: 1.1, neighbors: 4, len rects: 1
scale: 1.2, neighbors: 2, len rects: 1
scale: 1.2, neighbors: 3, len rects: 1
scale: 1.2, neighbors: 4, len rects: 1
scale: 1.3, neighbors: 2, len rects: 1

некоторые советы: Не выбирайте свой minSize слишком низко ... иначе будет обнаружен каждый маленький предмет, напоминающий лицо.

Я предполагаю, что вы используете все эти параметры, чтобы найти те, которые являются лучшими. Я выяснил, что миннигоры не должны быть слишком высокими, иначе он их не найдет.

убедитесь, что ваш каскадный xml-файл связан правильно. Если он не найдет его, он не даст ошибки, он просто не найдет никаких лиц.