Detectar automaticamente rostos em uma imagem

1

No meu local de trabalho, as fotografias do tamanho de um passaporte são digitalizadas juntas, depois cortadas em fotos individuais e salvas com números de arquivo exclusivos. Atualmente, usamos o Paint.net para selecionar manualmente, cortar e salvar as imagens.

Eu já vi a Cybershot Camera da Sony ter detecção de rosto. O Google também me dá algo sobre o iphoto ao procurar por detecção de rosto. O Picasa também enfrentou a detecção. Existem maneiras de autodetectar os rostos em um documento, o que aumentaria a produtividade no meu local de trabalho, reduzindo o tempo necessário para cortar imagens individuais.

Exemplo de documento digitalizado (um documento real tem 5 linhas de 4 imagens cada = 20 fotos): (de: link , fairuse)

Por exemplo. No Picasa 3.8, Ao clicar em Visualizar > Pessoas, todos os rostos são mostrados e me pedem para nomeá-los, posso salvar essas imagens individuais automaticamente com os nomes como imagens diferentes.

    
por abel 06.10.2010 / 13:29

1 resposta

1

Cortar fotos de passaporte automaticamente soa definitivamente factível. Corrigido condições de iluminação, sempre voltado para frente, formato de imagem consistente ... Eu não acho que alguém poderia pedir condições mais favoráveis para a detecção de rosto.

Eu tentei usar facedetect para ver os resultados em sua imagem de amostra:

Ospassaportesvêmemdiferentesformatosetamanhos,entãoelesserãocolocadosnamesadoscannerdeformairregular,maseusuponhoquevocêcolocaráasfotossemprenavertical.facedetectnosdaráoscentrosetamanhodetodososrostos.Emparticular,podemosusarotamanhodorostoecortaraáreaaoredorproporcionalmente.Comoasfotosdospassaportestendemacobrirumaáreafixadafotografia,pareceserumasuposiçãorelativamentesegura.

Cortarsub-regiõesdeumaimagemérealmentefácilusandoo ImageMagick . Eu escrevi um pequeno script (e áspero) para automatizar o processo:

#!/bin/sh
pc=60
files="P1Xb8.jpg"

fileno=1
for file in $files; do
  n=1
  facedetect $file | while read x y w h; do
    border=$(($w * $pc / 100))
    x=$(($x - $border))
    y=$(($y - $border))
    w=$(($w + $border * 2))
    h=$(($h + $border * 2))
    echo $x $y $w $h
    convert "$file" -gravity NorthWest -crop "${w}x${h}+$x+$y" "${fileno}_$n.jpg"
    n=$(($n + 1))
  done
  fileno=$(($fileno + 1))
done

Eu defini empiricamente uma área de borda de 60% (na segunda linha do script) da largura da face detectada. Estas são as quatro imagens que recebo:

que já é muito bom. Há sempre algum espaço em branco no topo, que eu consegui remover apenas adicionando "-fuzz 10% -trim" na invocação convert . Aqui está o resultado da primeira imagem depois disso:

Não é muito ruim para um roteiro rápido, e há muito espaço para melhorias. Por exemplo, a maioria dos passaportes usa uma orientação retrato, portanto, tem um fator vertical / horizontal diferente (geralmente 1,3). Além disso, os rostos tendem a ser ligeiramente movidos para cima (em 1,3 provavelmente). Corrigir isso resultaria em uma colheita melhor, evitando a necessidade de aparar totalmente o espaço em branco no topo.

Seria bom se você pudesse postar (mesmo em particular) uma amostra de digitalização de mesa para testar esse script em relação a alguma saída real.

Claro, essa sugestão requer uma instalação do Linux. Mas se eu entendi corretamente, não é totalmente irracional configurar uma instalação dedicada ou até mesmo uma máquina virtual para automatizar essa tarefa tediosa.

Se a privacidade não é um problema (mas eu duvido), eu estaria realmente interessado em ajudar a escrever uma solução decente em troca das faces cortadas, que eu usaria para melhorar o modelo de detecção de rosto.

    
por 22.10.2013 / 22:30