You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于OpenCV的Python人脸识别仅识别单张人脸问题求助

问题排查与解决方案

嘿,我仔细看了你的代码,确实发现了核心问题——你的代码只处理了单张人脸,完全没考虑多脸场景,咱们一步步来修复:

问题根源

  1. detect_face函数只返回第一张人脸
    你现在的函数里,最后只返回了faces[0](第一张脸的矩形)和对应的灰度区域,其他检测到的人脸直接被丢弃了。而且还有个小bug:你截取人脸灰度图时写的是gray[y:y + w, x:x + h],这是错误的——y轴对应高度,应该用h(高度值),正确的写法是gray[y:y+h, x:x+w],这个错误也会影响识别效果。

  2. predict函数没有循环处理多脸
    当前predict只调用一次detect_face拿到单张脸就处理,完全没遍历所有检测到的人脸,自然只能识别出一张。

修复后的代码

1. 修正detect_face函数,返回所有人脸

def detect_face(img):
    # 转为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 加载人脸检测器
    face_cascade = cv2.CascadeClassifier('opencv-files/lbpcascade_frontalface.xml')
    # 检测所有人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
    
    # 未检测到人脸时返回空列表
    if len(faces) == 0:
        return [], []
    
    # 收集所有人脸的灰度区域和对应的矩形框
    face_regions = []
    face_rects = []
    for (x, y, w, h) in faces:
        # 修正人脸区域截取的错误
        face_region = gray[y:y+h, x:x+w]
        face_regions.append(face_region)
        face_rects.append((x, y, w, h))
    
    return face_regions, face_rects

2. 修改predict函数,循环处理每一张人脸

def predict(test_img):
    img = test_img.copy()
    # 获取所有人脸区域和矩形框
    face_regions, face_rects = detect_face(img)
    
    # 遍历每一张检测到的人脸,逐一识别并绘制结果
    for face, rect in zip(face_regions, face_rects):
        label, confidence = face_recognizer.predict(face)
        print(f"当前人脸置信度: {confidence}")
        label_text = suclular[label]
        
        # 根据置信度调整识别标签
        if 42 < confidence < 70:
            label_text = "Tespit Edilemedi."
            print(label_text)
        elif confidence > 70:
            label_text = "Bilinmiyor"
        
        # 绘制人脸矩形和识别文本
        draw_rectangle(img, rect)
        draw_text(img, label_text, rect[0], rect[1] - 5)
    
    return img

额外注意点

确保你的训练代码部分(face_recognizer.train(faces, np.array(labels)))中的faces是正确的训练人脸区域列表,训练数据没问题的话,修改后的代码就能识别图片中所有的人脸了。

内容的提问来源于stack exchange,提问作者Veli Eroglu

火山引擎 最新活动