2013-05-11 11 views
6

Genel temanın doğru olduğuna eminim, ancak hiçbir yüz bulamıyorum. Kodum c=cv2.VideoCapture(0)'dan, yani bilgisayarın videokameradan okur. Daha sonra, yüzlerin nerede olduğunu göstermek için aşağıdaki ayarlara sahibim. Görebildiğiniz gibi, farklı scaleFactors ve minNeighbors'lardan geçiyorum ama rektler hep boşa dönüyor. Ayrıca, opencv/data/haarcascades paketinde bulunan dört farklı haarcascade xml dosyasını denedim.Yüzümü bulmak için OpenCV detectMultiScale özelliğini kullanıyorum

Herhangi bir ipucu?

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) 

cevap

6

Bilgisayarımda çalışmasını sağlamak için kodunuzu biraz değiştirdim. Böyle olduğu zaman ben koşmak alıyorum sonuçları

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 

Çıktı:

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 

Bazı tavsiyelerde: En minSize seçmeyin çok düşük ... Başka her küçük öğe olacak bir yüzü andıran algılandı.

En iyi olanları bulmak için tüm bu parametrelerden geçtiğinizi varsayıyorum. Minikorların çok yüksek olmaması gerektiğini öğrendim, başka hiçbir şey bulamayacaktı.

Kaskatlı xml dosyanızın doğru şekilde bağlı olduğundan emin olun. Eğer bulamazsa, bir hata vermez, sadece yüzleri bulamaz.

+0

Bunu denediğiniz için teşekkür ederim, ancak kod yazılan yerlerin benimkilerden farklı olduğunu görmüyorum. Dosya yeri doğru - kopyalayabilirim, cat edebilirim ve tam xml dosyası yazdırılabilir. – user592419

+0

2 fonksiyonunuz hakkında hiçbir şey değiştirmedim. Sadece ana değiştirdim. Hiç bir şey almayacak mısın? – Ojtwist

+0

Şaşırtıcı şekilde değil. Sakalım var ama arkadaşımı da yakalamıyor. – user592419