Как использовать возвращаемые значения cv2.detectMultiScale для распознавания лиц - PullRequest
0 голосов
/ 09 марта 2020

Я слоняюсь с распознаванием и распознаванием лиц. У меня было приложение, использующее библиотеку face_recognition для обнаружения и сравнения обнаруженных лиц для их идентификации, но я был разочарован коротким расстоянием обнаружения. Теперь я пытаюсь использовать haarcascade для обнаружения и face_recognition для распознавания. Проблема в том, что я не могу заставить работать возвращаемые значения deteMultiscale с функцией face_recognition.face_encodings (). Код сохраняет и идентификатор, но показывает один и тот же идентификатор для каждого лица, поэтому он не сохраняет и go через кодировки лиц, как и должно быть. Я думаю, что это как-то связано с возвращаемыми значениями обнаружения. Может ли кто-нибудь помочь мне продвинуться вперед? Вот часть моего кода:

while fvs.more():
        try:
            frame = fvs.read()
            frame = imutils.resize(frame, width=980)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            frame = np.dstack([frame, frame, frame])

            faces = faceCascade.detectMultiScale(
                frame,
                scaleFactor=1.5,
                minNeighbors=2,
                flags=cv2.CASCADE_SCALE_IMAGE
                        )


        except AttributeError as e:
            print(e)
            print('Check the camera connection')

        else:
            if process_this_frame:
                face_encodings = face_recognition.face_encodings(frame, faces)
                # print(face_encodings)
                face_names = []
                for face_encoding in face_encodings:
                    # See if the face is a match for the known face(s)
                    matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=1.0)
                    name = "Unknown"

                    # If a match was found in known_face_encodings, just use the first one.
                    if True in matches:
                        first_match_index = matches.index(True)
                        name = known_face_names[first_match_index]


                    face_names.append(name)
                    # print(face_names)

            process_this_frame = not process_this_frame

            for (x, y, w, h), name in zip(faces, face_names):
                if name == 'Unknown':
                    # print(name)
                    new_face = face_recognition.face_encodings(frame, faces)
                    # print(new_face)
                    if len(new_face) > 0:
                        known_face_encodings.append(new_face[0])
                        key = key + 1
                        known_face_names.append(str(key))
                        # print(known_face_names)
...