¿Cómo puedo recortar por lotes en función de la ubicación de la cara?

Tengo 12.000 fotos de un evento en el que solo aparece una persona en cada foto. Necesito recortar estas fotos para aplicar la regla de los tercios. La idea de hacer todos estos individualmente es desalentador y no puedo quitarles un 10% de la parte superior ya que cada foto es un poco diferente.

¿Hay alguna forma de recortar automáticamente todas estas fotos en función de la posición de la persona?

Tiene que ser con photoshop? Tal vez pueda manejarse con Mathematica o un script en python, si está versado en programación. Si es posible, agregue dos imágenes para ilustrar el problema/contraste/etc.
Si está familiarizado con ImageMagick, esto debería hacer lo que está buscando. stackoverflow.com/questions/4813608/…
Intenté algo similar usando OpenCV y python. Puedo poner mi guión en una respuesta si está de acuerdo con esta dirección.
No tiene que ser photoshop, probaré estas soluciones!

Respuestas (5)

Aquí hay una solución usando pythony opencv:

Esto recortará todas las caras que encuentre en las fotos jpeg en cualquier carpeta en la que lo ejecute, con el relleno especificado por las left, right, top, bottomvariables:

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)

Usar

pythonPara usar el script anterior , necesita opencvinstalarlo (solo busque en Google cómo instalarlo opencvpara su plataforma).

Luego guarde el código anterior como un .pyarchivo, "autocrop.py"o algo así, luego descargue y guarde este archivo y colóquelo en el mismo directorio que sus imágenes.

El script debe encontrar todos los .jpgarchivos en la carpeta y recortarlos según la configuración de relleno establecida en el código de Python.

Ejemplo:

Con el código anterior establecido en un relleno de 10 px para que sea dramático, aquí está la fuente y el resultado:

ingrese la descripción de la imagen aquí

Resultado:

ingrese la descripción de la imagen aquí

Aquí está el tutorial que adapté descaradamente:

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

Ese tutorial es mucho mejor explicando todo que yo. Básicamente, solo tomé ese código y lo agregué un poco para procesar cosas por lotes (en lugar de escribir nombres de archivo) y luego le dije que recortara y guardara en lugar de dibujar un rectángulo y mostrar la imagen.

Para python3: 1. pip install opencv-python, 2. Actualice todas las printdeclaraciones para usar paréntesis, 3. Cambie cv2.cv.CV_HAAR_SCALE_IMAGEa cv2.CASCADE_SCALE_IMAGE(fuente: stackoverflow.com/a/36243142/2125392 )

Gracias a la respuesta de @Ryan, que adapté hace 5 años, automaticé la mayor parte de mi primer trabajo de escritorio. Ahora es el recorte automático del paquete de código abierto en PyPI y se puede usar desde su terminal o a través de una API de Python.

Cultivo automático de Obama

Si tiene instalado Python, instálelo a través pip install autocropde y úselo desde la línea de comando:

autocrop -i pics -o crop -r reject -w 400 -H 400

En este ejemplo, recortará todos los archivos de imagen que pueda encontrar en la picscarpeta, los redimensionará a 400 pxcuadrados y los generará en el cropdirectorio. Las imágenes en las que no puede detectar una cara se enviarán al rejectdirectorio.

¡Enfriar! ¿Qué hace cuando hay dos caras en una imagen?
Actualmente, recorta la cara más grande detectada.

Descargo de responsabilidad: soy el desarrollador de esta herramienta.

Puede usar Face Crop Jet para detectar y recortar caras de fotos a granel. Se admiten imágenes de cualquier formato o tamaño. Las caras se detectarán y recortarán automáticamente (no solo la cara, una imagen de perfil para tarjetas de identificación).

El software se puede descargar desde http://www.facecropjet.com

ingrese la descripción de la imagen aquí

Una vez que haya instalado python y opencv, y luego instale el recorte automático como se explicó anteriormente, solo asegúrese de tener su carpeta de entrada y carpeta de salida ingresadas correctamente en la terminal para que funcione el recorte automático.

Para hacer esto, arrastre y suelte su carpeta en la terminal y copie y pegue las ubicaciones de los archivos en la línea de código usando la edición de texto (la entrada va después de -i y la salida va después de -o en la línea de código). Ahora que su línea de código está completa, copie y pegue el código terminado en la terminal y presione regresar o ingresar.

Aquí hay una línea de ejemplo (importante: todo lo que tiene que hacer es reemplazar la entrada y la salida):

recorte automático -i /Usuarios/su nombre de usuario/Escritorio/fotos -o /Usuarios/su nombre de usuario/Escritorio/recortado -r rechazar -w 1024 -H 1024

nota: i representa la carpeta de entrada o representa la carpeta donde se guardarán el archivo o las imágenes recortadas, también conocida como la carpeta de salida