我正在编写一个面部识别程序,并且在尝试训练识别器时一直出现此错误
TypeError: Expected cv::UMat for argument 'labels'
我的代码是
def detect_face(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5);
if (len(faces)==0):
return None, None
(x, y, w, h) = faces[0]
return gray[y:y+w, x:x+h], faces[0]
def prepare_training_data():
faces = []
labels = []
for img in photo_name_list: #a collection of file locations as strings
image = cv2.imread(img)
face, rect = detect_face(image)
if face is not None:
faces.append(face)
labels.append("me")
return faces, labels
def test_photos():
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
faces, labels = prepare_training_data()
face_recognizer.train(faces, np.ndarray(labels))
labels是从prepare_training_data返回的图像列表中每张照片的标签列表,我将其转换为numpy数组,因为我读到了这就是train()的要求。
答案 0 :(得分:1)
解决方案-标签应为整数列表,并且应使用numpy.array(labels)
(或np.array(labels)
)。
用于检查错误是否存在的虚拟示例:
labels=[0]*len(faces)
face_recognizer.train(faces, np.array(labels))
我在python上找不到关于openCV人脸识别器的任何文档,因此我开始研究c ++文档和示例。由于documentation,该库将labels
的{{1}}输入用作train
。 openCV文档提供的cpp example也使用std::vector<int>
。依此类推,图书馆甚至有一个error for not an integer input。
答案 1 :(得分:-1)
可能的解决方案:
作为错误,"TypeError: Expected Ptr<cv::UMat> for argument 'labels'"
需要整数值,
向 list
插入值时,将它们转换为 Integer
。
例如:
labels.append(int(value))