我想调整裁切后的面部图像的边距。我当前的代码可以检测并修剪脸部。但是,裁剪的图像太紧,如下面的输出图像所示。
输入图像:
从我的代码输出图像:
所需的输出(增加余量并使其平方):
下面是我的代码:
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)
代码:
使用scale_factor
控制新的矩形大小。 M
也可以使用其他公式。可能不需要使用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()
图像:
方法:
获得给定区域的中心点(cX, cY)
,并通过从两个(cX - M,cY - M)
中减去相同的值,从中获得图像的新左上角。因此,右上角将为(cX + M, cY + M)
。您可以使用比例因子,例如M * p
而不是M
,其中p
将控制新区域的大小。
中心点:
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
此外,新作物的图像可能超出范围。为了解决这个问题,可以完成newTop = max(0, newTop)
,newRight = min(imageWidth, newRight)
等。您可以在此处找到一个演示,