¿Cómo puedo recortar por lotes según la ubicación de la cara?

13

Tengo 12,000 fotos de un evento donde solo hay una persona en cada foto. Necesito recortar estas fotos para aplicar la regla de los tercios. La idea de hacer todo esto de forma individual es desalentadora y no puedo quitarles el 10% de la parte superior, ya que cada foto es un poco diferente.

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

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

Respuestas:

15

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

Para usar la secuencia de comandos anterior que necesita pythone opencvinstala (solo google cómo instalar 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 configurado en un relleno de 10 px para ser 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 para explicar todo que yo. Básicamente, simplemente tomé ese código y agregué un poco al proceso por lotes (en lugar de escribir nombres de archivos) y luego le dije que recortara y guardara en lugar de dibujar un rectángulo y mostrar la imagen.

Ryan
fuente
1
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 )
CivFan
3

Descargo de responsabilidad: soy el desarrollador de esta herramienta.

Puede usar Face Crop Jet para detectar y recortar caras de fotos en Bulk. 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 foto 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í

vyshak
fuente