使用face_recognition与cv2做人脸识别时出现空编码IndexError问题
问题原因
你遇到的IndexError: list index out of range错误本质是face_recognition.face_encodings(faceimg)返回了空列表,直接取下标0就触发越界。该错误仅在部分场景出现的核心原因如下:
- 多余的颜色空间转换导致人脸图像色彩异常:
face_recognition.load_image_file接口返回的图像默认是RGB格式,你调用cv2.COLOR_BGR2RGB对裁剪后的人脸做转换,相当于把RGB图像强行按BGR格式翻转颜色通道,导致人脸色彩完全偏离模型训练数据的分布,大量场景下模型无法提取到有效人脸特征 - 裁剪出的人脸区域存在遮挡、角度过偏、分辨率过低、光线异常等问题,模型无法识别
- 人脸坐标裁剪边界错误,切出的区域不包含完整人脸
修复方案
按以下逻辑优化代码即可解决问题:
- 删除多余的颜色转换代码,避免人脸色彩异常
- 调用
face_encodings后先判断返回列表是否为空,为空时直接跳过当前人脸处理逻辑,避免下标越界 - 直接对全局图像和已经检测到的人脸坐标提取特征,不需要单独裁剪人脸小图再做检测,效率更高、稳定性更强
- 修正人脸框绘制的坐标逻辑,避免标记位置偏移
优化后代码
import face_recognition import cv2 # 加载已知人脸并提取特征,提前做非空判断避免已知图也出问题 known_image = face_recognition.load_image_file("known_faces/person.jpg") known_encodings = face_recognition.face_encodings(known_image) if not known_encodings: print("已知人脸图像未检测到有效人脸,请检查known_faces/person.jpg") exit() known_encoding = known_encodings[0] # 加载待检测图像 unknown_image = face_recognition.load_image_file("unknown_faces/faces.jpg") image = cv2.imread("unknown_faces/faces.jpg", cv2.IMREAD_COLOR) # 检测待检测图像中的所有人脸位置 face_locations = face_recognition.face_locations(unknown_image) # 直接根据检测到的人脸位置批量提取特征,不需要裁剪后单独检测 face_encodings = face_recognition.face_encodings(unknown_image, face_locations) # 遍历所有人脸和对应特征 for (top, right, bottom, left), unface_encoding in zip(face_locations, face_encodings): results = face_recognition.compare_faces([known_encoding], unface_encoding, 0.5) print(results) if results[0]: cv2.rectangle(image, (left, top), (right, bottom), (0, 128, 0), 2) else: cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 1) cv2.imshow('base', image) cv2.waitKey(0) cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Colin coda
相关产品推荐
相关产品推荐

