Tuesday, 14 January 2020

lightroom - How can I batch crop based on face location?


I've got 12,000 photos from an event where there's only one person in each photo. I need to crop these photos to apply rule of thirds. The idea of doing all of these individually is daunting and I can't just take 10% off the top of them all since every photo is a little different.


Is there a way for me to automatically crop all of these photos based on the position of the person?



Answer





This will crop all the faces it finds in the jpeg photos in whatever folder you run it in, with the padding specified by the left, right, top, bottom variables:


import cv2
import sys
import glob

cascPath = "haarcascade_frontalface_default.xml"

# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)


files=glob.glob("*.jpg")
for file in files:

# Read the image
image = cv2.imread(file)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Detect faces in the image
faces = faceCascade.detectMultiScale(

gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)

print "Found {0} faces!".format(len(faces))

# Crop Padding

left = 10
right = 10
top = 10
bottom = 10

# Draw a rectangle around the faces
for (x, y, w, h) in faces:
print x, y, w, h

# Dubugging boxes

# cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)


image = image[y-top:y+h+bottom, x-left:x+w+right]

print "cropped_{1}{0}".format(str(file),str(x))
cv2.imwrite("cropped_{1}_{0}".format(str(file),str(x)), image)



To Use



To use the above script you need python and opencv installed (just google how to install opencv for your platform).


Then save the above code as a .py file, "autocrop.py"or something, Then download and save this file and put it in the same directory as your images.


The script should find all the .jpg files in the folder and crop them based on the padding settings set in the python code.


Example:


With the above code set to 10 px padding to be dramatic, here's the source and result:



enter image description here



Result:




enter image description here



Here's the tutorial I shamelessly adapted:


https://realpython.com/blog/python/face-recognition-with-python/


That tutorial is far better at explaining everything than I am. Basically I just took that code and added in the little bit to batch-process stuff (instead of typing filenames) and then told it to crop and save instead of drawing a rectangle and displaying the picture.


No comments:

Post a Comment

Why is the front element of a telephoto lens larger than a wide angle lens?

A wide angle lens has a wide angle of view, therefore it would make sense that the front of the lens would also be wide. A telephoto lens ha...