2013-03-25 8 views
0

Я работаю над скриптом обнаружения лица, который позволяет сразу обнаруживать несколько лиц, используя классический каскадный классификатор с открытым кодом (cv2) Харара OpenCV, но каждый раз, когда я вызываю эту функцию, программа зависает бесконечно без предъявления каких-либо признаков ошибки, вот код моей функции:Каскадный классификатор OpenCV с распознаванием лица

import cv2 
import cv2.cv 
def detect(img, cascade_fn='haarcascade_frontalface_alt2.xml', 
      scaleFactor=1.3, minNeighbors=4, minSize=(20, 20), 
      flags=cv.CV_HAAR_SCALE_IMAGE): 
    cascade = cv2.CascadeClassifier(cascade_fn) 
    faces = list() 
    test = True 
    while test == True: 
     rect = cascade.detectMultiScale(img, scaleFactor=scaleFactor, 
             minNeighbors=minNeighbors, 
             minSize=minSize, flags=flags) 
     if len(rect) == 0: 
      test = False 
     else: 
      for x1, y1, x2, y2 in rect: 
       faces.append(img[y1:y2, x1:x2]) 
       cv2.rectangle(img, (x1, y1), (x2, y2), color, (0, 0, 0)) 
    return faces 

Так что, пожалуйста, может кто-нибудь точка мне причина я столкнулся эта ошибка, спасибо.

ответ

1

В случае, если detectMultiScale не обнаружит никаких лиц, test присваивается False и концы цикла завершаются. Если он фактически обнаруживает лица, они добавляются в список faces, и прямоугольник рисуется так же, как вы (предположительно).

Но test остается True, что означает, что ваша петля снова выполняется. И так как ни одна из его входных переменных не была изменена, detectMultiScale обнаружит те же грани и снова добавит их в список faces. Следовательно, в этом случае цикл никогда не закончится.

Вы можете сделать это:

import cv2 
def detect(img, cascade_fn='haarcascade_frontalface_alt2.xml', 
     scaleFactor=1.3, minNeighbors=4, minSize=(20, 20), 
     flags=cv2.cv.CV_HAAR_SCALE_IMAGE): 
    cascade = cv2.CascadeClassifier(cascade_fn) 
    faces = list() 
    rect = cascade.detectMultiScale(img, scaleFactor=scaleFactor, 
            minNeighbors=minNeighbors, 
            minSize=minSize, flags=flags) 
    for x1, y1, x2, y2 in rect: 
     faces.append(img[y1:y2, x1:x2]) 
     cv2.rectangle(img, (x1, y1), (x2, y2), color, (0, 0, 0)) 
    return faces 
Смежные вопросы