我一直在研究一个可以让你使用OpenCV(cv2)Haar级联分类器同时检测多个面部的人脸检测脚本,然而,每次调用此函数时,程序都会无限期地冻结而不会出现任何错误迹象,这是我的功能代码:
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
所以,请有人指出我面对这个错误的原因,谢谢。
答案 0 :(得分: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