OpenCV 4 TypeError: Ожидается cv::UMat для аргумента 'метки'

Я пишу программу распознавания лиц и получаю эту ошибку, когда пытаюсь обучить свой распознаватель

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))

метки - это список меток для каждой фотографии в списке изображений, возвращаемых из prepare_training_data, и я преобразую его в массив с нулевыми значениями, потому что я прочитал, что для этого требуется train().

2 ответа

Решение - метки должны быть списком целых чисел, и вы должны использовать numpy.array(labels) (или же np.array(labels)).

Дурацкий пример проверки отсутствия ошибки:

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

Я не нашел никакой документации для рекоднизеров лица openCV на python, поэтому я начал просматривать документацию и примеры C++. И из-за документации эта библиотека использует labels вход для train как std::vector<int>, Пример cpp, предоставленный openCV docs, также использует vector<int> labels, И так далее, в библиотеке даже есть ошибка не целочисленного ввода.

Возможное решение:

Как ошибка, "TypeError: Expected Ptr<cv::UMat> for argument 'labels'" ожидает целочисленного значения при вставке значений в list, преобразовать их в Integer.

например:

      labels.append(int(value))  
Другие вопросы по тегам