Jak mogę grupować uprawy na podstawie lokalizacji twarzy?

13

Mam 12 000 zdjęć z wydarzenia, w którym na każdym zdjęciu jest tylko jedna osoba. Muszę przyciąć te zdjęcia, aby zastosować zasadę trzech trzecich. Pomysł robienia tych wszystkich osobno jest zniechęcający i nie mogę po prostu wziąć 10% zniżki na wszystkie, ponieważ każde zdjęcie jest trochę inne.

Czy istnieje sposób, aby automatycznie przyciąć wszystkie te zdjęcia na podstawie pozycji osoby?

Obywatel
źródło
2
Czy to musi być w Photoshopie? Może poradzisz sobie z Mathematica lub skryptem w Pythonie, jeśli jesteś obeznany z programowaniem. Jeśli to możliwe, dodaj dwa zdjęcia, aby zilustrować problem / kontrast / itp.
anderstood
Jeśli znasz program ImageMagick, powinien zrobić to, czego szukasz. stackoverflow.com/questions/4813608/…
Nehal Dattani
Próbowałem czegoś podobnego przy użyciu OpenCV i Pythona. Mogę podać mój skrypt w odpowiedzi, jeśli zgadzasz się z tym kierunkiem.
agtoever
To nie musi być Photoshop, wypróbuję te rozwiązania!
Obywatel

Odpowiedzi:

15

Oto rozwiązanie wykorzystujące pythoni opencv:

Spowoduje to przycięcie wszystkich twarzy, które znajdzie na zdjęciach JPEG w dowolnym folderze, w którym je uruchomisz, z dopełnieniem określonym przez left, right, top, bottomzmienne:

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)

Używać

Aby użyć powyższy skrypt co potrzeba pythoni opencvzainstalowany (tylko google jak zainstalować opencvna platformie).

Następnie zapisz powyższy kod jako .pyplik "autocrop.py"lub coś, a następnie pobierz i zapisz ten plik i umieść go w tym samym katalogu co zdjęcia.

Skrypt powinien znaleźć wszystkie .jpgpliki w folderze i przyciąć je na podstawie ustawień wypełnienia ustawionych w kodzie python.

Przykład:

Z powyższym kodem ustawionym na padding 10 px, aby być dramatycznym, oto źródło i wynik:

wprowadź opis zdjęcia tutaj

Wynik:

wprowadź opis zdjęcia tutaj

Oto samouczek, który bezwstydnie dostosowałem:

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

Ten samouczek jest o wiele lepszy w wyjaśnianiu wszystkiego niż ja. Zasadniczo po prostu wziąłem ten kod i dodałem trochę do przetwarzania wsadowego (zamiast wpisywania nazw plików), a następnie kazałem go przyciąć i zapisać zamiast rysować prostokąt i wyświetlać obraz.

Ryan
źródło
1
W przypadku python3: 1. pip install opencv-python, 2. Zaktualizuj wszystkie printinstrukcje, aby używały nawiasów, 3. Zmień cv2.cv.CV_HAAR_SCALE_IMAGEna cv2.CASCADE_SCALE_IMAGE(źródło: stackoverflow.com/a/36243142/2125392 )
CivFan,
3

Oświadczenie: Jestem twórcą tego narzędzia.

Możesz użyć Face Crop Jet do wykrywania i kadrowania twarzy ze zdjęć w trybie Bulk. Obsługiwane są obrazy w dowolnym formacie lub rozmiarze. Twarz zostanie wykryta i przycięta automatycznie (nie tylko twarz, zdjęcie profilowe dla kart identyfikacyjnych).

Oprogramowanie można pobrać ze strony http://www.facecropjet.com

wprowadź opis zdjęcia tutaj

Wyszak
źródło