Como posso cortar em lote com base na localização da face?

13

Eu tenho 12.000 fotos de um evento em que há apenas uma pessoa em cada foto. Preciso cortar essas fotos para aplicar a regra dos terços. A ideia de fazer tudo isso individualmente é assustadora e não posso tirar 10% de tudo, pois todas as fotos são um pouco diferentes.

Existe uma maneira de eu cortar automaticamente todas essas fotos com base na posição da pessoa?

Cidadão
fonte
2
Tem que ser com photoshop? Talvez você possa gerenciar com o Mathematica ou um script em python, se você é versado em programação. Se possível, adicione duas figuras para ilustrar o problema / contraste / etc.
anderstood 23/02
Se você estiver familiarizado com o ImageMagick, isso deve fazer o que você está procurando. stackoverflow.com/questions/4813608/…
Nehal Dattani
Eu tentei algo semelhante usando OpenCV e python. Posso colocar meu script em uma resposta se você estiver bem com essa direção.
agtoever 23/02
Não precisa ser photoshop, vou tentar essas soluções!
Citizen

Respostas:

15

Aqui está uma solução usando pythone opencv:

Isso cortará todas as faces que encontrar nas fotos jpeg em qualquer pasta em que você a executar, com o preenchimento especificado pelas left, right, top, bottomvariáveis:

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)

Usar

Para usar o script acima, você precisa pythone opencvinstalou (basta pesquisar no google como instalar opencvna sua plataforma).

Em seguida, salve o código acima como um .pyarquivo, "autocrop.py"ou algo assim. Em seguida, faça o download e salve este arquivo e coloque-o no mesmo diretório que suas imagens.

O script deve encontrar todos os .jpgarquivos na pasta e cortá-los com base nas configurações de preenchimento definidas no código python.

Exemplo:

Com o código acima definido como preenchimento de 10 px para ser dramático, aqui está a fonte e o resultado:

insira a descrição da imagem aqui

Resultado:

insira a descrição da imagem aqui

Aqui está o tutorial que eu adaptei descaradamente:

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

Esse tutorial é muito melhor para explicar tudo do que eu. Basicamente, peguei esse código e adicionei um pouco ao processo de lote (em vez de digitar os nomes dos arquivos) e depois pedi para cortar e salvar, em vez de desenhar um retângulo e exibir a imagem.

Ryan
fonte
1
Para python3: 1. pip install opencv-python, 2. Atualize todas as printinstruções para usar parênteses, 3. Altere cv2.cv.CV_HAAR_SCALE_IMAGEpara cv2.CASCADE_SCALE_IMAGE(fonte: stackoverflow.com/a/36243142/2125392 )
CivFan 11/11
3

Isenção de responsabilidade: sou o desenvolvedor desta ferramenta.

Você pode usar o Face Crop Jet para detectar e cortar rostos de fotos em massa. São suportadas imagens de qualquer formato ou tamanho. Os rostos serão detectados e cortados automaticamente (não apenas o rosto, uma imagem de perfil para cartões de identificação).

O software pode ser baixado em http://www.facecropjet.com

insira a descrição da imagem aqui

vyshak
fonte