想象一下,你是一名学校管理员,每学期都需要处理大量学生的学籍照片。这些照片来自不同的来源,尺寸和质量各不相同。你需要确保这些照片都符合学校的规定尺寸,以便在学籍档案中使用。手动裁剪每张照片将是一项繁重而乏味的任务,但是幸运的是,有一种更智能的方式可以解决这个问题。
准备工作
在开始之前,你需要安装以下Python库:
- OpenCV
- dlib
你可以使用以下命令来安装这些库:
pip install opencv-python-headless
pip install dlib
步骤1:导入所需库和模型
首先,让我们导入所需的Python库和模型。这些库将帮助我们进行图像处理和人脸识别。
import cv2
import dlib
import os
步骤2:定义裁剪函数
接下来,我们将定义一个函数来自动裁剪学籍照片。这个函数将根据人脸识别,将每张照片裁剪成特定的尺寸,并保存到输出文件夹中。
def detect_face_and_crop(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()
# 计算半身图像的裁剪区域的坐标
crop_width = int(w * (1 + extend_ratio))
crop_height = int(h * (1 + extend_ratio))
crop_x1 = max(0, x - (crop_width - w) // 2)
crop_y1 = max(0, y - (crop_height - h) // 2)
crop_x2 = min(x + w + (crop_width - w) // 2, image.shape[1])
crop_y2 = min(y + h + (crop_height - h) // 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}")
这个函数将接受输入图像路径、输出图像路径、目标尺寸和扩展比例作为参数,然后执行人脸识别、裁剪和保存操作。
步骤3:批量处理学籍照片
现在,我们将定义一个函数来批量处理学籍照片。它将遍历指定的输入文件夹中的所有照片,然后将它们自动裁剪并保存到指定的输出文件夹中。
def batch_detect_face_and_crop(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_crop(input_image_path, output_image_path, target_size, extend_ratio)
这个函数将接受输入文件夹路径、输出文件夹路径、目标尺寸和扩展比例作为参数,并将自动裁剪后的照片保存到输出文件夹中。
步骤4:执行批量处理
现在,我们已经准备好了所有函数,可以开始批量处理学籍照片了。只需调用batch_detect_face_and_crop
函数并传入输入和输出文件夹的路径以及其他参数。
if __name__ == "__main__":
input_folder = "你的输入文件夹路径" # 替换为你的输入文件夹路径
output_folder = "你的输出文件夹路径" # 替换为你的输出文件夹路径
target_size = (260, 320)
extend_ratio = 2.0 # 增大extend_ratio以获得更大范围的半
身图像
batch_detect_face_and_crop(input_folder, output_folder, target_size, extend_ratio)
结束语
通过这个简单而强大的Python脚本,你可以轻松地自动裁剪学籍照片,以确保它们符合中小学学籍照片的规格。这将帮助你节省大量的时间和精力,特别是当你需要处理大量照片时。