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

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)

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(
        minSize=(30, 30),
        flags =

    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, ""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.


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

enter image description here


enter image description here

Here’s the tutorial I shamelessly adapted:

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.