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?

• Does it have to be with photoshop? Maybe you coule manage with Mathematica or a script in python, if you are versed to programming. If possible, add two pictures to illustrate the problem/contrast/etc. – anderstood Feb 23 '15 at 3:17
• If you are familiar with ImageMagick, this should do what you are looking for. stackoverflow.com/questions/4813608/… – Nehal Dattani Feb 23 '15 at 4:03
• I tried something similar using OpenCV and python. I can put my script in an answer if you are ok with this direction. – agtoever Feb 23 '15 at 10:38
• It does not have to be photoshop, I'll try these solutions! – Citizen Feb 23 '15 at 15:48

Here's a solution using `python` and `opencv`:

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

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

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Detect faces in the image
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)

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

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:

Result:

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.

• For python3: 1. `pip install opencv-python`, 2. Update all `print` statements to use parentheses, 3. Change `cv2.cv.CV_HAAR_SCALE_IMAGE` to `cv2.CASCADE_SCALE_IMAGE` (source: stackoverflow.com/a/36243142/2125392) – CivFan Oct 11 '18 at 18:49

Disclaimer: Im the developer of this tool.

You can use Face Crop Jet to detect and crop faces from photos in Bulk.Images of any Format or Size is supported.Faces will be detected and cropped automatically(not just the face,a profile picture for id cards).