OpenCV级联分类器人脸检测冻结

0 投票
1 回答
3407 浏览
提问于 2025-04-17 20:11

我一直在写一个人脸检测的程序,这个程序可以同时检测多个脸,使用的是OpenCV的Haar Cascade分类器。但是,每次我调用这个函数的时候,程序就会卡住,没法继续,也没有任何错误提示。下面是我这个函数的代码:

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

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

撰写回答