[Python] 纯文本查看 复制代码 '''
学籍照片自动裁剪工具:
1.自动将整个文件夹的照片用人脸识别的方式,以人脸为中心向周边延伸2倍来裁剪头像。
2.生成的图片大小为260*320像素,符合中小学学籍照片规格。一般容量都是20-30KB左右。
3.经测试,人脸识别还是很准确的,放个狗头上去就识别不了
# 在终端运行这个命令 python -m pip install dlib-19.22.99-cp38-cp38-win_amd64.whl
by xinixu 2023.7.21
'''
import cv2
import dlib
import os
def detect_face_and_half_body(input_image_path, output_image_path, target_size=(260, 320), extend_ratio=1.0):
# 使用OpenCV加载图像
image = cv2.imread(input_image_path)
# 将图像转换为灰度图像,以加快人脸检测速度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 从Dlib加载人脸检测器模型
face_detector = dlib.get_frontal_face_detector()
# 在图像中检测人脸
faces = face_detector(gray_image)
if len(faces) > 0:
# 假设图像中只有一个人脸(你可以修改代码来处理多个人脸)
face = faces[0]
# 获取人脸的边界框坐标
x, y, w, h = face.left(), face.top(), face.width(), face.height()
# 计算人脸的中心点
center_x = x + w // 2
center_y = y + h // 2
# 计算半身图像的裁剪区域的坐标
crop_width = int(w * (1 + extend_ratio))
crop_height = int(h * (1 + extend_ratio))
crop_x1 = max(0, center_x - crop_width // 2)
crop_y1 = max(0, center_y - crop_height // 2)
crop_x2 = min(center_x + crop_width // 2, image.shape[1])
crop_y2 = min(center_y + crop_height // 2, image.shape[0])
# 裁剪图像以获取半身图像
half_body_image = image[crop_y1:crop_y2, crop_x1:crop_x2]
# 将半身图像调整到目标尺寸
resized_image = cv2.resize(half_body_image, target_size, interpolation=cv2.INTER_AREA)
# 保存调整后的图像
cv2.imwrite(output_image_path, resized_image)
print(f"检测到人脸,半身图像已保存:{output_image_path}")
else:
print(f"未在图像中检测到人脸:{input_image_path}")
def batch_detect_face_and_half_body(input_folder, output_folder, target_size=(260, 320), extend_ratio=1.0):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
input_image_path = os.path.join(input_folder, filename)
output_image_path = os.path.join(output_folder, filename)
detect_face_and_half_body(input_image_path, output_image_path, target_size, extend_ratio)
if __name__ == "__main__":
input_folder = "G:\\201901" # 替换为你的输入文件夹路径
output_folder = "G:\\20190101" # 替换为你的输出文件夹路径
target_size = (260, 320)
extend_ratio = 2.0 # 增大extend_ratio以获得更大范围的半身图像
batch_detect_face_and_half_body(input_folder, output_folder, target_size, extend_ratio)
测试只适合1寸人头照片,不要拿集体照片测试,集体照片只能认出一个人。 |