You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python和OpenCV裁剪符合护照规格的人像照片?

解决OpenCV人脸裁剪的两个问题:偏移调整与红色边框去除

问题1:裁剪区域贴近人脸边缘,添加偏移量适配护照规格

护照照片要求人脸居中,头顶、下巴及两侧留有合理空间。我们可以基于检测到的人脸尺寸(w,h)设置比例化的偏移量,同时确保裁剪区域不超出图片边界:

  • 头顶区域:向上扩展0.3倍人脸高度的空间
  • 下巴区域:向下扩展0.2倍人脸高度的空间
  • 左右两侧:各扩展0.15倍人脸宽度的空间

计算新的裁剪坐标时,用max(0, ...)和min(图片尺寸, ...)限制范围,避免数组索引越界。

问题2:裁剪后图片带红色边框

原因是你在原始图片img上绘制了红色边框,随后直接从这张带框的图片里裁剪人脸。解决方法是直接使用原始未修改的图片进行裁剪,绘制边框仅用于预览(可选)。

修改后的完整代码

import cv2 

img = cv2.imread('testImage.jpg') 
# 获取图片宽高,用于限制裁剪边界
img_h, img_w = img.shape[:2]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') 
faces = face_cascade.detectMultiScale(gray, 1.1, 4)

for (x, y, w, h) in faces: 
    # 可选:绘制边框用于预览,不影响裁剪结果
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2) 
    
    # 设置偏移量(可根据需求调整比例)
    top_offset = int(h * 0.3)
    bottom_offset = int(h * 0.2)
    left_offset = int(w * 0.15)
    right_offset = int(w * 0.15)
    
    # 计算新的裁剪坐标,确保不超出图片边界
    crop_x1 = max(0, x - left_offset)
    crop_y1 = max(0, y - top_offset)
    crop_x2 = min(img_w, x + w + right_offset)
    crop_y2 = min(img_h, y + h + bottom_offset)
    
    # 直接从原始图片裁剪(而非画框后的img)
    cropped_face = img[crop_y1:crop_y2, crop_x1:crop_x2] 
    cv2.imwrite('testImage-Cropped.jpg', cropped_face) 

# 可选:显示预览窗口(如果需要看画框效果)
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键改动说明

  1. 偏移量计算:通过比例化的偏移值替代固定像素,适配不同尺寸的人脸和图片
  2. 边界限制:用max和min确保裁剪坐标在图片范围内,避免报错
  3. 裁剪源修正:直接使用原始img裁剪,绘制边框仅作为预览操作,不影响最终保存的裁剪图

内容的提问来源于stack exchange,提问作者MarcusDeroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:47:22