Как обнаружить несколько лиц на одном изображении?

#python #opencv #crop #face-detection #viola-jones

#питон #opencv #обрезка #распознавание лиц #виола-Джонс #python

Вопрос:

Я пытаюсь обрезать несколько лиц с одного и того же изображения, используя python и opencv, но он показывает мне ошибку. Если есть какой-либо другой способ сделать это, пожалуйста, дайте мне знать. Ниже приведен код вместе с ошибкой.

 import cv2

# Load some pre-trained data on face frontals from opencv (haar cascade algorithm)
trained_face_data = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# Choose an image to detect faces in
img = cv2.imread('mask.png')
    
# Must convert to greyscale
grayscaled_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
# Detect Faces 
face_coordinates = trained_face_data.detectMultiScale(grayscaled_img)

img_crop = []

# Draw rectangles around the faces
for (x, y, w, h) in face_coordinates:
    cv2.rectangle(img, (x,y), (x w, y h), (0, 255, 0), 2)
    img_crop.append(img[y:y h, x:x w])

    
cv2.imshow('Cropped', img_crop)

cv2.waitKey()
  

 **TypeError**                                 Traceback (most recent call last)
<ipython-input-4-7c85402c34e9> in <module>
     32 [enter image description here][1]
     33 
---> 34 cv2.imshow('Cropped', img_crop)
     35 #cv2.imshow('crop', img_crop2)
     36 #cv2.imshow('Face Detector',  img)

TypeError: Expected Ptr<cv::UMat> for argument 'mat'e here
  

Комментарии:

1. вы вызываете imshow со списком изображений ( img_crop ), но он ожидает одно изображение. вы можете показывать только одно изображение одновременно в одном открытом окне, поэтому вы можете выполнить for цикл img_crop

Ответ №1:

Одним из решений является сохранение всех изображений в списке:

Отображать каждое изображение по одному

 for cropped in img_crop:
    cv2.imshow('Cropped', cropped)
    cv2.waitKey(0)
  

Предположим, что ваше входное изображение:

введите описание изображения здесь

Результат:

введите описание изображения здесь введите описание изображения здесь

Если вы хотите сохранить их, вы могли бы сделать:

 for counter, cropped in enumerate(img_crop):
    cv2.imshow('Cropped', cropped)
    cv2.imwrite("pose_result_{}.png".format(counter), cropped)
    cv2.waitKey(0)
  

Код:

 import cv2
import numpy as np

# Load some pre-trained data on face frontal from opencv (haar cascade algorithm)
trained_face_data = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# Choose an image to detect faces in
img = cv2.imread('mask.png')

# Must convert to greyscale
grayscaled_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Detect Faces
face_coordinates = trained_face_data.detectMultiScale(grayscaled_img)

img_crop = []

# Draw rectangles around the faces
for (x, y, w, h) in face_coordinates:
    cv2.rectangle(img, (x, y), (x   w, y   h), (0, 255, 0), 2)
    img_crop.append(img[y:y   h, x:x   w])

for counter, cropped in enumerate(img_crop):
    cv2.imshow('Cropped', cropped)
    cv2.imwrite("pose_result_{}.png".format(counter), cropped)
    cv2.waitKey(0)