2013-05-11 15 views
6

Jestem prawie pewien, że mam ogólny motyw prawidłowy, ale nie znajduję żadnych twarzy. Mój kod czyta się z c=cv2.VideoCapture(0), tj. Z kamery wideo komputera. Następnie mam następującą konfigurację, aby uzyskać miejsce, w którym znajdują się twarze. Jak widzisz, przechodzę przez różne współczynniki scale i minNeighbors, ale rects zawsze wraca puste. Próbowałem również każdego z czterech różnych plików xml haarcascade zawartych w pakiecie opencv/data/haarcascades.Używanie OpenCV detectMultiScale do znalezienia mojej twarzy

Jakieś wskazówki?

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) 

Odpowiedz

6

Zmieniłem trochę twój kod, aby uruchomić go na moim komputerze. Gdy uruchomię to w taki mam wyniki

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 

wyjściowa:

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 

kilka rad: Nie podnoś swoją minSize zbyt niskie ... else każdy mały element, który przypomina twarz będzie wykryte.

Zakładam, że przeglądasz wszystkie te parametry, aby znaleźć te, które są najlepsze. Dowiedziałem się, że minNeighors nie powinien być zbyt wysoki, bo inaczej go nie znajdzie.

Upewnij się, że plik kaskady xml jest poprawnie połączony. Jeśli go nie znajdzie, nie da błędu, po prostu nie znajdzie twarzy.

+0

Dziękuję za wypróbowanie tego, chociaż nie widzę, gdzie Twój opublikowany kod różni się od mojego, pomijając trochę refaktoryzacji. Lokalizacja pliku jest poprawna - mogę go skopiować, przetestować i wydrukować pełny plik xml. – user592419

+0

Nie zmieniłem nic o twoich 2 funkcjach. Właśnie zmieniłem główny. Nie dostaniesz żadnych rectów? – Ojtwist

+0

Zaskakująco, nie. Mam brodę, ale nie łapie też mojego przyjaciela. – user592419

Powiązane problemy