Bagaimana saya bisa memotong tanaman berdasarkan lokasi wajah?

13

Saya mendapat 12.000 foto dari sebuah acara di mana hanya ada satu orang di setiap foto. Saya perlu memotong foto-foto ini untuk menerapkan aturan pertiga. Gagasan untuk melakukan semua ini secara individual sangat menakutkan dan saya tidak bisa hanya mengambil 10% dari semuanya karena setiap foto sedikit berbeda.

Apakah ada cara bagi saya untuk memotong semua foto ini secara otomatis berdasarkan posisi orang tersebut?

Warganegara
sumber
2
Apakah harus dengan photoshop? Mungkin Anda dapat mengelola dengan Mathematica atau skrip dengan python, jika Anda berpengalaman dalam pemrograman. Jika memungkinkan, tambahkan dua gambar untuk mengilustrasikan masalah / kontras / dll.
anderstood
Jika Anda terbiasa dengan ImageMagick, ini harus melakukan apa yang Anda cari. stackoverflow.com/questions/4813608/…
Nehal Dattani
Saya mencoba sesuatu yang mirip menggunakan OpenCV dan python. Saya dapat menempatkan skrip saya dalam jawaban jika Anda setuju dengan arah ini.
agtoever
Tidak harus photoshop, saya akan mencoba solusi ini!
Warga

Jawaban:

15

Inilah solusi menggunakan pythondan opencv:

Ini akan memotong semua wajah yang ditemukannya di foto jpeg di folder apa pun yang Anda jalankan, dengan padding yang ditentukan oleh left, right, top, bottomvariabel:

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)

Menggunakan

Untuk menggunakan skrip di atas yang Anda butuhkan pythondan opencvinstal (hanya google cara menginstal opencvuntuk platform Anda).

Kemudian simpan kode di atas sebagai .pyfile, "autocrop.py"atau apalah, Kemudian unduh dan simpan file ini dan letakkan di direktori yang sama dengan gambar Anda.

Script harus menemukan semua .jpgfile dalam folder dan memotongnya berdasarkan pengaturan padding yang diatur dalam kode python.

Contoh:

Dengan kode di atas diatur ke 10 px padding menjadi dramatis, inilah sumber dan hasilnya:

masukkan deskripsi gambar di sini

Hasil:

masukkan deskripsi gambar di sini

Inilah tutorial yang saya adaptasi tanpa malu-malu:

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

Tutorial itu jauh lebih baik dalam menjelaskan segalanya daripada saya. Pada dasarnya saya hanya mengambil kode itu dan menambahkan sedikit ke dalam proses batch (bukan mengetikkan nama file) dan kemudian menyuruhnya memotong dan menyimpan alih-alih menggambar persegi panjang dan menampilkan gambar.

Ryan
sumber
1
Untuk python3: 1. pip install opencv-python, 2. Perbarui semua printpernyataan untuk menggunakan tanda kurung, 3. Ubah cv2.cv.CV_HAAR_SCALE_IMAGEke cv2.CASCADE_SCALE_IMAGE(sumber: stackoverflow.com/a/36243142/2125392 )
CivFan
3

Penafian: Saya pengembang alat ini.

Anda dapat menggunakan Face Crop Jet untuk mendeteksi dan memotong wajah dari foto dalam jumlah besar. Gambar dari segala Format atau Ukuran didukung. Wajah akan terdeteksi dan dipangkas secara otomatis (bukan hanya wajah, gambar profil untuk kartu id).

Perangkat lunak ini dapat diunduh dari http://www.facecropjet.com

masukkan deskripsi gambar di sini

vyshak
sumber