简体   繁体   English

Python 使用 dlib 裁剪人脸图像

[英]Python cropped face image using dlib

I want to adjust the margin of cropped face image.我想调整裁剪后的人脸图像的边距。 My current code can detect and crop face.我当前的代码可以检测和裁剪人脸。 However, the cropped image is too tight as shown in the below output image.但是,裁剪后的图像太紧,如下图 output 图像所示。

Input image:输入图像:

在此处输入图像描述

Below is my code:下面是我的代码:

import face_recognition
import cv2

img = face_recognition.load_image_file("test.png")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

face_locations = face_recognition.face_locations(img_rgb)

for top, right, bottom, left in face_locations:
    # Draw a box around the face
    cv2.rectangle(img, (left, top), (right, bottom), (0, 0, 255), 2)

    crop_img = img_rgb[top:bottom, left:right]
    cv2.imwrite('test_crop.png', crop_img)

UPDATE: It will not work correctly for out of bound bounding boxes after scaling.更新:缩放后超出边界框将无法正常工作。

Code:代码:

Use the scale_factor to control the new rectangle size.使用scale_factor控制新的矩形大小。 Also a different formula can be used for M . M也可以使用不同的公式。 Using abs may not be necessary.可能不需要使用abs

import face_recognition
import cv2


img = face_recognition.load_image_file("test.png")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_rgb_copy = img_rgb.copy()


## Define scale factor and window size
scale_factor = 1.1
sz1 = img_rgb.shape[1] * 2
sz2 = img_rgb.shape[0] * 2


face_locations = face_recognition.face_locations(img_rgb)

for top, right, bottom, left in face_locations:
    # Draw a box around the face
    #cv2.rectangle(img, (left, top), (right, bottom), (0, 0, 255), 2)

    crop_img = img_rgb[top:bottom, left:right]
    #cv2.imwrite('test_crop.png', crop_img)



    ## Calculate center points and rectangle side length
    width = right - left
    height = bottom - top
    cX = left + width // 2
    cY = top + height // 2
    M = (abs(width) + abs(height)) / 2


    ## Get the resized rectangle points
    newLeft = max(0, int(cX - scale_factor * M))
    newTop = max(0, int(cY - scale_factor * M))
    newRight = min(img_rgb.shape[1], int(cX + scale_factor * M))
    newBottom = min(img_rgb.shape[0], int(cY + scale_factor * M))


    ## Draw the circle and bounding boxes
    cv2.circle(img_rgb_copy, (cX, cY), radius=0, color=(0, 0, 255), thickness=2)
    cv2.rectangle(img_rgb_copy, (left, top), (right, bottom), (0, 0, 255), 2)
    cv2.rectangle(img_rgb_copy, (newLeft, newTop), (newRight, newBottom), (255, 0, 0), 2)


    ## Show the original image in window resized to double
    cv2.namedWindow('image', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('image', sz1, sz2)
    cv2.imshow("image", img_rgb_copy)
    cv2.waitKey(0)


cv2.destroyAllWindows()

Image:图片:

在此处输入图像描述

Method:方法:

Get the center point (cX, cY) of given region and from that get new left corner of image by subtracting same value from both (cX - M,cY - M) .获取给定区域的中心点(cX, cY)并通过从两者中减去相同的值(cX - M,cY - M)从中获得图像的新左角。 So the right corner will be (cX + M, cY + M) .所以右上角将是(cX + M, cY + M) You can use a scale factor such as, M * p instead of M , where p will control how large or small the new region will be.您可以使用比例因子,例如M * p代替M ,其中p将控制新区域的大小。

Center Point:中心点:

width = right - left
height = bottom - top

centerX = left + (width / 2)
centerY = top + (height / 2)

M = (abs(width) + abs(height)) / 2

0 <= p < 1, for smaller crop than given in a side
p > 1, for larger crop margin

Also the new crop may be out of bounds in image.此外,新作物可能超出图像范围。 To solve it something like, newTop = max(0, newTop) , newRight = min(imageWidth, newRight) can be done and similar for others.为了解决这个问题, newTop = max(0, newTop) , newRight = min(imageWidth, newRight)可以完成,其他人也可以这样做。 You can find a demo here,你可以在这里找到一个演示,

https://www.desmos.com/calculator/bgn9dobkjt https://www.desmos.com/calculator/bgn9dobkjt

在此处输入图像描述

DeepFace wraps many face detection libraries. DeepFace 封装了许多人脸检测库。 Besides, it applies face alignment in the background.此外,它在背景中应用了人脸 alignment。 You can detect faces in a line of code.您可以在一行代码中检测人脸。

#!pip install deepface
from deepface import DeepFace
backends = ['opencv', 'ssd', 'dlib', 'mtcnn']
for backend in backends:
   detected_face = DeepFace.detectFace("img.jpg", detector_backend = backend)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM