在 Python 中使用 OpenCV 从图像中裁剪人脸
Cropping faces from an image using OpenCV in Python
我目前正在尝试从图像中裁剪人脸。
无论图像中有多少张面孔,我都希望代码能够正常工作。
输入图片示例:
Image with faces
我想裁剪脸部,这样我就可以 运行 对它们进行面部关键点检测算法(以前制作)。
最终结果将如下所示:
Image after facial keypoint detection
我的代码目前是:
# Load in color image for face detection
image = cv2.imread('images/obamas4.jpg')
# Convert the image to RGB colorspace
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Make a copy of the original image to draw face detections on
image_copy = np.copy(image)
# Convert the image to gray
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# Detect faces in the image using pre-trained face dectector
faces = face_cascade.detectMultiScale(gray_image, 1.25, 6)
# Print number of faces found
print('Number of faces detected:', len(faces))
# Get the bounding box for each detected face
for f in faces:
x, y, w, h = [ v for v in f ]
cv2.rectangle(image_copy, (x,y), (x+w, y+h), (255,0,0), 3)
# Define the region of interest in the image
face_crop = gray_image[y:y+h, x:x+w]
# Display the image with the bounding boxes
fig = plt.figure(figsize = (9,9))
axl = fig.add_subplot(111)
axl.set_xticks([])
axl.set_yticks([])
ax1.set_title("Obamas with Face Detection")
axl.imshow(image_copy)
# Display the face crops
fig = plt.figure(figsize = (9,9))
axl = fig.add_subplot(111)
axl.set_xticks([])
axl.set_yticks([])
axl.set_title("Obamas Face Crops")
axl.imshow(face_crop)
输出如下所示:
enter image description here
现在它只输出图像中检测到的最后一张脸。我确定我遗漏了一些简单的东西,比如 for 循环。
我希望能够 运行 我的面部关键点检测算法适用于所有灰色裁剪面部图像。
感谢您的帮助!
问题出在您的代码中,face_crop 仅存储最后检测到的人脸。
所以把它做成一个列表并将所有的面孔附加到它上面。然后使用 for 循环显示所有面孔。像这样:
face_crop = []
for f in faces:
x, y, w, h = [ v for v in f ]
cv2.rectangle(image_copy, (x,y), (x+w, y+h), (255,0,0), 3)
# Define the region of interest in the image
face_crop.append(gray_image[y:y+h, x:x+w])
for face in face_crop:
cv2.imshow('face',face)
cv2.waitKey(0)
我使用 cv2.imshow() 来显示图像。您可以修改它以使用 plt.imshow()
希望对您有所帮助!
我目前正在尝试从图像中裁剪人脸。
无论图像中有多少张面孔,我都希望代码能够正常工作。
输入图片示例: Image with faces
我想裁剪脸部,这样我就可以 运行 对它们进行面部关键点检测算法(以前制作)。
最终结果将如下所示: Image after facial keypoint detection
我的代码目前是:
# Load in color image for face detection
image = cv2.imread('images/obamas4.jpg')
# Convert the image to RGB colorspace
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Make a copy of the original image to draw face detections on
image_copy = np.copy(image)
# Convert the image to gray
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# Detect faces in the image using pre-trained face dectector
faces = face_cascade.detectMultiScale(gray_image, 1.25, 6)
# Print number of faces found
print('Number of faces detected:', len(faces))
# Get the bounding box for each detected face
for f in faces:
x, y, w, h = [ v for v in f ]
cv2.rectangle(image_copy, (x,y), (x+w, y+h), (255,0,0), 3)
# Define the region of interest in the image
face_crop = gray_image[y:y+h, x:x+w]
# Display the image with the bounding boxes
fig = plt.figure(figsize = (9,9))
axl = fig.add_subplot(111)
axl.set_xticks([])
axl.set_yticks([])
ax1.set_title("Obamas with Face Detection")
axl.imshow(image_copy)
# Display the face crops
fig = plt.figure(figsize = (9,9))
axl = fig.add_subplot(111)
axl.set_xticks([])
axl.set_yticks([])
axl.set_title("Obamas Face Crops")
axl.imshow(face_crop)
输出如下所示: enter image description here
现在它只输出图像中检测到的最后一张脸。我确定我遗漏了一些简单的东西,比如 for 循环。
我希望能够 运行 我的面部关键点检测算法适用于所有灰色裁剪面部图像。
感谢您的帮助!
问题出在您的代码中,face_crop 仅存储最后检测到的人脸。
所以把它做成一个列表并将所有的面孔附加到它上面。然后使用 for 循环显示所有面孔。像这样:
face_crop = []
for f in faces:
x, y, w, h = [ v for v in f ]
cv2.rectangle(image_copy, (x,y), (x+w, y+h), (255,0,0), 3)
# Define the region of interest in the image
face_crop.append(gray_image[y:y+h, x:x+w])
for face in face_crop:
cv2.imshow('face',face)
cv2.waitKey(0)
我使用 cv2.imshow() 来显示图像。您可以修改它以使用 plt.imshow()
希望对您有所帮助!