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 回答