Як я можу грунтувати врожай на основі розташування обличчя?


13

У мене 12 000 фотографій з події, де на кожній фотографії є ​​лише одна людина. Мені потрібно обрізати ці фотографії, щоб застосувати правило третини. Ідея робити все це окремо є химерною, і я не можу просто зняти 10% з усіх вершин, оскільки кожна фотографія трохи інша.

Чи є спосіб, щоб я автоматично обрізав усі ці фотографії залежно від положення людини?


2
Це має бути з фотошопом? Можливо, ви кулею керуєте за допомогою Mathematica або скрипту в python, якщо ви вмієте програмувати. Якщо можливо, додайте дві картинки, щоб проілюструвати проблему / контраст / тощо.
зрозумів

Якщо ви знайомі з ImageMagick, це має робити те, що ви шукаєте. stackoverflow.com/questions/4813608 / ...
Nehal Dattani

Я спробував щось подібне, використовуючи OpenCV та python. Я можу поставити свій сценарій у відповідь, якщо ви добре з цим напрямом.
agtoever

Це не обов’язково бути фотошопом, я спробую ці рішення!
Громадянин

Відповіді:


15

Ось рішення з використанням pythonта opencv:

Це дозволить обрізати всі обличчя, які він знайде на фотографіях jpeg, у будь-якій папці, в якій ви запускаєте, за допомогою прокладки, вказаної left, right, top, bottomзмінними:

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)

Використовувати

Для використання вищезазначеного сценарію вам потрібно pythonі opencvвстановити (просто google, як встановити opencvдля вашої платформи).

Потім збережіть вищезгаданий код у вигляді .pyфайлу "autocrop.py"чи чогось іншого, потім завантажте і збережіть цей файл і помістіть його в ту саму каталог, що і ваші зображення.

Сценарій повинен знайти всі .jpgфайли в папці та обрізати їх, виходячи з налаштувань додатків, встановлених у коді python.

Приклад:

Якщо вищезазначений код встановлений на 10 пікселів, це буде драматичним, ось джерело та результат:

введіть тут опис зображення

Результат:

введіть тут опис зображення

Ось підручник, який я безсоромно адаптував:

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

Цей підручник набагато краще пояснює все, ніж я. В основному я просто взяв цей код і додав трохи, щоб обробляти пакетну обробку (замість того, щоб вводити імена файлів), а потім сказав їй обрізати та зберігати, а не малювати прямокутник і показувати зображення.


1
Для Python3: 1. pip install opencv-python, 2. Оновлення всіх printзаяв використовувати круглі дужки, 3. Зміна cv2.cv.CV_HAAR_SCALE_IMAGEв cv2.CASCADE_SCALE_IMAGE(джерело: stackoverflow.com/a/36243142/2125392 )
CivFan

3

Відмова: Я розробник цього інструменту.

Ви можете використовувати Face Crop Jet для виявлення та обрізання облич з фотографій масово. Підтримуються зображення будь-якого формату чи розміру. Фаси будуть виявлені та обрізані автоматично (не лише обличчя, зображення профілю для ідентифікаційних карток).

Програмне забезпечення можна завантажити з http://www.facecropjet.com

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.