OpenCV人脸裁剪功能优化:实现批量保存裁剪后的人脸图像
解决人脸裁剪后批量保存独立文件的问题
嘿,我看了你的代码,问题出在循环里没有为每个人脸生成唯一的文件名,导致每次保存都会覆盖之前的文件。我帮你调整了代码,不仅实现了批量保存所有人脸,还优化了一些细节让代码更灵活好用:
import cv2 import os def facecrop(input_image_path, output_dir="cropped_faces"): # 加载人脸检测器 facedata = "haarcascade_frontalface_alt.xml" cascade = cv2.CascadeClassifier(facedata) # 读取输入图片 img = cv2.imread(input_image_path) if img is None: print(f"Error: 无法读取图片 {input_image_path}") return # 检测人脸(添加参数提升检测准确率) faces = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5) # 创建输出目录(不存在则自动创建) os.makedirs(output_dir, exist_ok=True) # 遍历每个人脸,单独保存 for idx, (x, y, w, h) in enumerate(faces): # 裁剪出人脸区域 face_img = img[y:y+h, x:x+w] # 生成带序号的唯一文件名,避免覆盖 output_path = os.path.join(output_dir, f"face_{idx}.jpg") # 保存人脸图片 cv2.imwrite(output_path, face_img) print(f"已保存人脸图片: {output_path}") # 使用示例:处理class.jpg,保存到默认的cropped_faces文件夹 facecrop("class.jpg")
关键修改点说明:
- 修复参数浪费:原来的
image参数没实际用到,现在改成传入具体图片路径,让函数能处理任意图片 - 自动管理输出目录:创建专门的文件夹存放裁剪后的人脸,避免文件杂乱
- 生成唯一文件名:用
enumerate获取人脸的索引序号,给每个文件加上编号,确保不会互相覆盖 - 优化检测效果:给
detectMultiScale添加了scaleFactor和minNeighbors参数,提升人脸检测的准确率 - 增加错误提示:如果图片读取失败会给出明确提示,避免程序莫名崩溃
现在运行代码后,所有检测到的人脸都会被保存到cropped_faces文件夹里,每个人脸都是独立的文件~
内容的提问来源于stack exchange,提问作者Serek
相关产品推荐
相关产品推荐

