0

私はOpenCV(cv2)のHaar Cascade Classifierを使用して、一度に複数の顔を検出できる顔検出スクリプトに取り組んできましたが、この関数を呼び出すたびに、プログラムはエラーの兆候を示さずに無期限にフリーズします。私の関数のコード:

 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

ですから、私がこのエラーに直面している理由を誰かが私に指摘してもらえますか、ありがとう。

4

1 に答える 1

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
于 2013-03-25T09:28:09.813 に答える