выбрать конкретное лицо из нескольких обнаруженных лиц внутри изображения из каскада Хаара в python - PullRequest
0 голосов
/ 05 июня 2019

У меня есть несколько изображений, содержащих одно или несколько лиц, но я хочу выбрать только одно лицо, если изображение содержит несколько лиц внутри. Я использовал OpenCV Python для обнаружения лица с помощью каскада Хаара, что отлично, но я не могу выбрать конкретное лицо из изображений с несколькими детекторами лица. Мой код ниже:

cascPath = "Python35\\Lib\\site-packages\\cv\\data\\haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)


listing = os.listdir(path\of\images)
print("Detection face of new individual images")
for file in listing:
    im = (path1 + '\\' + imagePath + '\\' + file)
    imag = cv2.imread(im)
    imag = imutils.resize(imag, width=500)
    gray = cv2.cvtColor(imag, cv2.COLOR_BGR2GRAY)

    # Detect faces in the image
    faces = faceCascade.detectMultiScale(gray)
    print("Founded face is {} faces which are {}".format(len(faces), faces))

    if len(faces)>1:
        i = 0
        for (x, y, w, h) in faces:
            cv2.rectangle(imag, (x, y), (x + w, y + h), (255, 0, 0), 2)
            cv2.putText(imag, "Face #{}".format(i), (x - 10, y - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            i = i + 1
        cv2.imshow("im", imag)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        var = int(input("Which face you want to detect it"))
        faces = faces[var]
        print("Selected face is", faces)
        print("type of selected face",type(faces))


    print("the drawing face is", faces)
    # Draw a rectangle around the face
    for (x, y, w, h) in faces:
        cv2.rectangle(imag, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = imag[y:y + h, x:x + w]
        cv2.imshow("face", roi_color)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

Этот код работает успешно, если изображение содержит только одно лицо, но когда есть несколько лиц, и я хочу выбрать одно из них, введя его индекс, я получаю следующую ошибку.

for (x, y, w, h) in faces:
TypeError: 'numpy.int32' object is not iterable

Может кто-нибудь, пожалуйста, помогите мне, когда проблема, я выбираю уже найденный прямоугольник, почему отклонить его.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Я решил проблему, связанную с итератором граней, следующим образом и успешно работал.

if len(faces) > 1:
    i = 0
    for f in faces:
        face = faces[i]
        (x, y, w, h) = face

        cv2.rectangle(imag, (x, y), (x + w, y + h), (255, 0, 0), 2)
        cv2.putText(imag, "Face #{}".format(i), (x - 10, y - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        i = i + 1
0 голосов
/ 05 июня 2019

Можете ли вы напечатать объект лица перед итерацией, запустить свой код и показать нам, что выводится? В какой именно строке указана ошибка?

...