网格检测结果重排序与Python有序人脸裁剪技术问询
问题解答
问题一:恢复网格检测结果的顺序
要将打乱的网格检测结果恢复为从上到下、从左到右的顺序,核心是基于检测框的坐标进行排序:
- 优先按检测框的顶部y坐标排序(y值越小,位置越靠上);
- 对于y值相近的检测框(可设阈值,比如人脸高度的1/2,判断为同一行),再按左侧x坐标排序(x值越小,位置越靠左)。
具体实现思路:
- 提取每个检测结果的(x, y, w, h)坐标;
- 自定义排序规则:先比较y坐标,若两个框的y差小于设定阈值则按x排序,否则按y排序;
- 用该规则对所有检测结果排序,即可得到网格顺序。
问题二:修改人脸检测裁剪代码,实现有序保存
修改要点
- 对人脸坐标排序:按从上到下、从左到右的规则对检测到的人脸坐标排序;
- 批量处理输入图片:遍历「Input Images」下的所有图像文件,替代原代码的单张图片读取;
- 确保输出文件夹存在:提前创建「Output Images」文件夹,避免保存失败;
- 优化文件名:用「图片序号_人脸序号」命名,避免不同图片的人脸文件重名。
修改后的完整代码
import os import cv2 import numpy as np # 加载人脸分类器 face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # 定义输入输出文件夹路径 input_dir = "Input Images" output_dir = "Output Images" # 创建输出文件夹(不存在则创建) os.makedirs(output_dir, exist_ok=True) # 遍历输入文件夹中的所有图像文件 for img_idx, filename in enumerate(os.listdir(input_dir)): # 仅处理常见图片格式 if filename.lower().endswith(('.png', '.jpg', '.jpeg')): img_path = os.path.join(input_dir, filename) img = cv2.imread(img_path) if img is None: print(f"无法读取图片: {filename}") continue # 转为灰度图用于检测 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(150, 150), ) if len(faces) == 0: print(f"图片 {filename} 中未检测到人脸") continue # 对人脸坐标排序:先按y分组(同一行),再按x从左到右排序 avg_h = np.mean([h for (x, y, w, h) in faces]) y_threshold = avg_h // 2 # 同一行的y值阈值 sorted_faces = sorted(faces, key=lambda rect: (rect[1] // y_threshold, rect[0])) # 裁剪并保存排序后的人脸 for face_idx, (x, y, w, h) in enumerate(sorted_faces): # 按原逻辑扩展裁剪区域 face = img[y-65:y+h+40, x-40:x+w+55] # 处理边界溢出,避免索引错误 face = face.clip(min=0) # 生成保存路径 save_name = f"{img_idx}_{face_idx}.jpg" save_path = os.path.join(output_dir, save_name) cv2.imwrite(save_path, face) print(f"已保存: {save_path}") print(f"[INFO] 图片 {filename} 中检测到 {len(faces)} 张人脸") # 关闭所有OpenCV窗口 cv2.destroyAllWindows()
关键修改说明
- 排序逻辑:通过
sorted()函数和自定义key实现分组排序,先按y坐标除以阈值的整数部分分组(同一行),再按x坐标排序; - 批量处理:遍历输入文件夹并过滤图片格式,实现多图批量处理;
- 边界防护:添加
face.clip(min=0),避免扩展裁剪区域时出现数组索引越界; - 文件名规范:用「图片序号_人脸序号」命名,避免不同图片的人脸文件重名覆盖。
内容的提问来源于stack exchange,提问作者Hidy Nancy
相关产品推荐
相关产品推荐

