如何从同一张图像中检测出多张脸?

问题描述

我正在尝试使用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

解决方法

一种解决方案是在将所有图像存储在列表中之后:

一次显示每个图像

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

假设您输入的图像:

enter image description here

结果:

enter image description here enter image description here

如果要保存它们,可以执行以下操作:

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)
    cv2.waitKey(0)