【发布时间】:2020-12-11 02:26:06
【问题描述】:
我在一家拍摄学校照片的工作室工作,我们正在尝试制作一个脚本,以消除将每张照片裁剪为模板的工作。我们使用的照片相当统一,但它们的分辨率和头部位置略有不同。我开始尝试编写脚本,但我的 Python 知识相当有限,并且通过大量的反复试验和在线资源,我认为我已经完成了大部分工作。
目前,我正在尝试找出从 NumPy 数组中裁剪图像的最佳方法,并将头部放在我想要的位置,但我找不到一个好的灵活解决方案。对于姿势 1 和姿势 2,头部的位置需要稍有不同,因此它需要易于动态更改(可能会实现某种简单的 GUI 来输入类似的东西,但现在我可以更改代码)。
我还需要能够更改照片的输出分辨率,以便它们都是统一的 (2000x2500)。有人有什么想法吗?
目前这是我当前的代码,它只是保存检测到的人脸正方形:
import cv2
import os.path
import glob
# Cascade path
cascPath = 'haarcascade_frontalface_default.xml'
# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)
#Check for output folder and create if its not there
if not os.path.exists('output'):
os.makedirs('output')
# Read Images
images = glob.glob('*.jpg')
for c, i in enumerate(images):
image = cv2.imread(i, 1)
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Find face(s) using cascade
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1, # size of groups
minNeighbors=5, # How many groups around are detected as face for it to be valid
minSize=(500, 500) # Min size in pixels for face
)
# Outputs number of faces found in image
print('Found {0} faces!'.format(len(faces)))
# Places a rectangle on face
for (x, y, w, h) in faces:
imgCrop = image[y:y+h,x:x+w]
if len(faces) > 0:
#Saves Images to output folder with OG name
cv2.imwrite('output/'+ i, imgCrop)
我可以像这样使用它:
# Crop Padding
left = 300
right = 300
top = 400
bottom = 1000
for (x, y, w, h) in faces:
imgCrop = image[y-top:y+h+bottom, x-left:x+w+right]
但是输出相当随机的分辨率和基于图像分辨率的变化
【问题讨论】:
标签: python python-3.x opencv crop