如何从同一张图像中检测多张人脸?
How to detect multiple faces from the same image?
我正在尝试使用 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)
假设您的输入图像:
结果:
如果你想保存它们,你可以这样做:
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)
我正在尝试使用 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)
假设您的输入图像:
结果:
如果你想保存它们,你可以这样做:
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)