python - OpenCV 4 TypeError:参数 'labels' 的预期 cv::UMat

标签 python python-3.x numpy opencv facial-identification

我正在写一个人脸识别程序,当我尝试训练我的识别器时,我总是遇到这个错误

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() 需要的。

最佳答案

解决方案 - 标签应该是整数列表,你应该使用 numpy.array(labels) (或 np.array(labels) )。

检查错误缺失的虚拟示例:

labels=[0]*len(faces)
face_recognizer.train(faces, np.array(labels))

我还没有在 python 上找到任何关于 openCV 人脸识别器的文档,所以我开始查看 c++ 文档和示例。由于documentation这个库使用 labels输入 train作为std::vector<int> . cpp example ,由 openCV 文档提供,也使用 vector<int> labels .等等,图书馆甚至有一个error for not an integer input .

关于python - OpenCV 4 TypeError:参数 'labels' 的预期 cv::UMat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54274298/

相关文章:

python - 如果非空,则将字典的值写入列表中

python - 为什么我的 'button.bind' 不会调用 'makeChoice' ?

pandas - 从 ERA5 再分析中提取移动船舶的时间和空间变量

python - 为什么使用 while 循环更好?

python - 按降序对列表进行排序 Jinja

python - Numpy:沿特定 Axis 的外和

python - Django 和 Postgresql 运算符不存在 : integer = character varying

python - 如何在python中声明一个数组

python - Zip 参数 #2 必须支持迭代。为什么重新分配 ndarray 时会生成此错误?

python - 如何在numpy中求和NaN?