【问题标题】:Cropping faces from an image using OpenCV in Python在 Python 中使用 OpenCV 从图像中裁剪人脸
【发布时间】:2018-07-08 19:32:01
【问题描述】:

我目前正在尝试从图像中裁剪人脸。

无论图像中有多少张面孔,我都希望代码能够正常工作。

输入图像示例: 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 循环。

我希望能够在所有灰色裁剪的面部图像上运行我的面部关键点检测算法。

感谢您的帮助!

【问题讨论】:

    标签: python opencv computer-vision face-detection


    【解决方案1】:

    问题出在您的代码中,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()

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 2018-03-07
      • 2013-01-23
      • 2019-06-11
      • 2020-09-27
      • 2020-12-26
      • 2016-09-22
      • 2014-04-28
      • 2015-03-11
      相关资源
      最近更新 更多