Come posso ritagliare in batch in base alla posizione del viso?


13

Ho 12.000 foto di un evento in cui c'è solo una persona in ogni foto. Devo ritagliare queste foto per applicare la regola dei terzi. L'idea di fare tutto questo individualmente è scoraggiante e non posso semplicemente togliermi il 10% di sconto, dato che ogni foto è un po 'diversa.

C'è un modo per ritagliare automaticamente tutte queste foto in base alla posizione della persona?


2
Deve essere con Photoshop? Forse sei in grado di gestire con Mathematica o uno script in Python, se sei esperto di programmazione. Se possibile, aggiungere due immagini per illustrare il problema / contrasto / ecc.
Compresi il

Se hai familiarità con ImageMagick, questo dovrebbe fare quello che stai cercando. stackoverflow.com/questions/4813608/...
Nehal Dattani

Ho provato qualcosa di simile usando OpenCV e Python. Posso dare una risposta alla mia sceneggiatura se stai bene in questa direzione.
agtoever,

Non deve essere Photoshop, proverò queste soluzioni!
Cittadino

Risposte:


15

Ecco una soluzione che utilizza pythone opencv:

Questo ritaglia tutte le facce che trova nelle foto jpeg in qualsiasi cartella in cui la esegui, con il riempimento specificato dalle left, right, top, bottomvariabili:

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)

Usare

Per utilizzare lo script sopra è necessario pythone opencvinstallato (basta google come installare opencvper la tua piattaforma).

Quindi salvare il codice sopra come .pyfile "autocrop.py"o qualcosa del genere, quindi scaricare e salvare questo file e inserirlo nella stessa directory delle immagini.

Lo script dovrebbe trovare tutti i .jpgfile nella cartella e ritagliarli in base alle impostazioni di riempimento impostate nel codice Python.

Esempio:

Con il codice sopra impostato su un'imbottitura di 10 px per essere drammatico, ecco la fonte e il risultato:

inserisci qui la descrizione dell'immagine

Risultato:

inserisci qui la descrizione dell'immagine

Ecco il tutorial che ho adattato spudoratamente:

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

Quel tutorial è molto meglio nello spiegare tutto di me. Fondamentalmente ho semplicemente preso quel codice e aggiunto un po 'di cose all'elaborazione batch (invece di digitare i nomi dei file) e poi gli ho detto di ritagliare e salvare invece di disegnare un rettangolo e visualizzare l'immagine.


1
Per python3: 1. pip install opencv-python, 2. Aggiornare tutte printle dichiarazioni di usare parentesi, 3. Modificare cv2.cv.CV_HAAR_SCALE_IMAGEa cv2.CASCADE_SCALE_IMAGE(fonte: stackoverflow.com/a/36243142/2125392 )
CivFan

3

Disclaimer: sono lo sviluppatore di questo strumento.

Puoi utilizzare Face Crop Jet per rilevare e ritagliare i volti dalle foto in blocco. Sono supportate immagini di qualsiasi formato o dimensione. I volti verranno rilevati e ritagliati automaticamente (non solo il volto, un'immagine del profilo per le carte d'identità).

Il software può essere scaricato da http://www.facecropjet.com

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.