Kırpma yüz konumuna göre nasıl toplulabilirim?


13

Her fotoğrafta yalnızca bir kişinin bulunduğu bir etkinlikte 12.000 fotoğrafım var. Üçte bir kuralı uygulamak için bu fotoğrafları kırpmam gerekiyor. Tüm bunları ayrı ayrı yapma fikri göz korkutucu ve her fotoğraf biraz farklı olduğu için hepsinin üstünde% 10 indirim yapamıyorum.

Bu fotoğrafları otomatik olarak kişinin konumuna göre kırpmamın bir yolu var mı?


2
Photoshop ile mi olmalı? Belki programlama konusunda bilgiliyseniz, Mathematica veya python'da bir komut dosyası ile yönetebilirsiniz. Mümkünse, sorunu / kontrastı / vb. Göstermek için iki resim ekleyin.
anderstood

ImageMagick'e aşina iseniz, bu aradığınız şeyi yapmalıdır. stackoverflow.com/questions/4813608/…
Nehal Dattani

OpenCV ve python kullanarak benzer bir şey denedim. Eğer bu yönde iyiysen senaryomu bir cevaba koyabilirim.
agtoever

Photoshop olmak zorunda değil, bu çözümleri deneyeceğim!
Vatandaş

Yanıtlar:


15

İşte pythonve kullanarak bir çözüm opencv:

Bu, jpeg fotoğraflarında bulduğu tüm yüzleri, çalıştırdığınız herhangi bir klasörde, left, right, top, bottomdeğişkenler tarafından belirtilen dolgu ile kırpacaktır :

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)

Kullanmak

Yukarıdaki komut dosyasını kullanmak için ihtiyacınız pythonve opencvyüklenmiş (sadece google opencvplatformunuz için nasıl kurulur ).

Sonra yukarıdaki kodu bir .pydosya "autocrop.py"veya başka bir şey olarak kaydedin , sonra bu dosyayı indirip kaydedin ve resimlerinizle aynı dizine koyun.

Komut dosyası .jpgklasördeki tüm dosyaları bulmalı ve python kodunda ayarlanan dolgu ayarlarına göre kırpmalıdır.

Misal:

Yukarıdaki kod dramatik olacak şekilde 10 piksel dolguya ayarlandığında, kaynak ve sonuç şöyledir:

resim açıklamasını buraya girin

Sonuç:

resim açıklamasını buraya girin

İşte utanmadan adapte ettiğim öğretici:

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

Bu eğitim her şeyi açıklamakta benden daha iyi. Temelde bu kodu aldım ve bir şeyleri toplu olarak işlemek için biraz ekledim (dosya adları yazmak yerine) ve daha sonra bir dikdörtgen çizmek ve resmi görüntülemek yerine kırpıp kaydetmesini söyledim.


1
Python3 için: 1. pip install opencv-python, 2. Güncelleme bütün printifadeleri 3. Değişim parantez kullanmak cv2.cv.CV_HAAR_SCALE_IMAGEiçin cv2.CASCADE_SCALE_IMAGE: (kaynak stackoverflow.com/a/36243142/2125392 )
CivFan

3

Feragatname: Bu aracın geliştiricisiyim.

Sen kullanabilirsiniz Yüz Mahsul Jet algılamak ve ekin herhangi Format Bulk.Images fotoğraflardan yüzleri ya Boyut supported.Faces algılanır ve otomatik olarak (sadece yüz, kimlik kartları için profil resmi) kesilir olduğunu.

Yazılım http://www.facecropjet.com adresinden indirilebilir.

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.