Wie kann ich basierend auf der Gesichtsposition stapelweise zuschneiden?

Ich habe 12.000 Fotos von einer Veranstaltung, bei der auf jedem Foto nur eine Person zu sehen ist. Ich muss diese Fotos zuschneiden, um die Drittelregel anzuwenden. Die Idee, all dies einzeln zu machen, ist entmutigend, und ich kann nicht einfach 10 % von allen abziehen, da jedes Foto ein wenig anders ist.

Gibt es eine Möglichkeit, alle diese Fotos basierend auf der Position der Person automatisch zuzuschneiden?

Muss es mit Photoshop sein? Vielleicht kommen Sie mit Mathematica oder einem Skript in Python zurecht, wenn Sie sich mit Programmierung auskennen. Wenn möglich, fügen Sie zwei Bilder hinzu, um das Problem/den Kontrast/usw. zu veranschaulichen.
Wenn Sie mit ImageMagick vertraut sind, sollte dies das tun, wonach Sie suchen. stackoverflow.com/questions/4813608/…
Ich habe etwas Ähnliches mit OpenCV und Python versucht. Ich kann mein Skript in eine Antwort einfügen, wenn Sie mit dieser Richtung einverstanden sind.
Es muss nicht Photoshop sein, ich werde diese Lösungen ausprobieren!

Antworten (5)

Hier ist eine Lösung mit pythonund opencv:

Dadurch werden alle Gesichter, die es in den JPEG-Fotos findet, in dem Ordner, in dem Sie es ausführen, mit der durch die left, right, top, bottomVariablen angegebenen Auffüllung beschnitten:

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)

Benutzen

Um das obige Skript zu verwenden, müssen Sie es installieren pythonund opencvinstallieren (googlen Sie einfach, wie Sie es opencvfür Ihre Plattform installieren).

Speichern Sie dann den obigen Code als .pyDatei "autocrop.py"oder so. Laden Sie dann diese Datei herunter, speichern Sie sie und legen Sie sie im selben Verzeichnis wie Ihre Bilder ab.

Das Skript sollte alle .jpgDateien im Ordner finden und sie basierend auf den im Python-Code festgelegten Padding-Einstellungen zuschneiden.

Beispiel:

Wenn der obige Code auf 10 px Padding eingestellt ist, um dramatisch zu sein, hier ist die Quelle und das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Hier ist das Tutorial, das ich schamlos angepasst habe:

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

Dieses Tutorial ist viel besser darin, alles zu erklären, als ich es bin. Im Grunde genommen habe ich diesen Code einfach genommen und ein bisschen zur Stapelverarbeitung hinzugefügt (anstatt Dateinamen einzugeben) und ihm dann gesagt, er solle zuschneiden und speichern, anstatt ein Rechteck zu zeichnen und das Bild anzuzeigen.

Für python3: 1. pip install opencv-python, 2. Aktualisieren Sie alle printAnweisungen, um Klammern zu verwenden, 3. Wechseln Sie cv2.cv.CV_HAAR_SCALE_IMAGEzu cv2.CASCADE_SCALE_IMAGE(Quelle: stackoverflow.com/a/36243142/2125392 )

Dank der Antwort von @Ryan, die ich vor 5 Jahren angepasst habe, habe ich den größten Teil meines ersten Schreibtischjobs automatisiert. Es ist jetzt das Open-Source-Paket autocrop auf PyPI und kann von Ihrem Terminal oder über eine Python-API verwendet werden.

Autokultur Obama-Ernte

Wenn Sie Python installiert haben, installieren Sie es über pip install autocropund verwenden Sie es so von der Befehlszeile aus:

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

In diesem Beispiel wird es jede Bilddatei zuschneiden, die es im picsOrdner finden kann, ihre Größe auf 400 pxQuadrate ändern und sie im cropVerzeichnis ausgeben. Bilder, bei denen kein Gesicht erkannt werden kann, werden an das rejectVerzeichnis gesendet.

Kühl! Was macht es, wenn zwei Gesichter auf einem Bild sind?
Derzeit wird das größte erkannte Gesicht abgeschnitten.

Haftungsausschluss: Ich bin der Entwickler dieses Tools.

Sie können Face Crop Jet verwenden , um Gesichter aus Fotos in großen Mengen zu erkennen und zuzuschneiden. Bilder in jedem Format und jeder Größe werden unterstützt. Gesichter werden automatisch erkannt und zugeschnitten (nicht nur das Gesicht, ein Profilbild für Ausweise).

Die Software kann von http://www.facecropjet.com heruntergeladen werden

Geben Sie hier die Bildbeschreibung ein

Sobald Sie Python und opencv installiert haben und dann Autocrop wie oben beschrieben installieren, stellen Sie einfach sicher, dass Sie Ihren Eingabeordner und Ausgabeordner korrekt in das Terminal eingegeben haben, damit Autocrop funktioniert.

Ziehen Sie dazu Ihren Ordner per Drag & Drop in das Terminal und kopieren Sie die Dateispeicherorte und fügen Sie sie mit Textbearbeitung in die Codezeile ein (die Eingabe folgt nach -i und die Ausgabe nach -o in der Codezeile). Nachdem Ihre Codezeile vollständig ist, kopieren Sie den fertigen Code und fügen Sie ihn in das Terminal ein und drücken Sie die Eingabetaste oder die Eingabetaste.

Hier ist eine Beispielzeile (wichtig: Sie müssen nur die Ein- und Ausgabe ersetzen):

autocrop -i /Benutzer/IhrBenutzername/Desktop/Fotos -o /Benutzer/IhrBenutzername/Desktop/beschnitten -r Ablehnen -w 1024 -H 1024

Hinweis: i steht für den Eingabeordner o steht für den Ordner, in dem die neu zugeschnittenen Dateien oder Bilder gespeichert werden, auch als Ausgabeordner bezeichnet