На моем рабочем месте фотографии паспортного размера сканируются вместе, затем разрезаются на отдельные изображения и сохраняются с уникальными номерами файлов. В настоящее время мы используем Paint.net для ручного выбора, вырезания и сохранения изображений.
Я видел, что в камере Sony Cybershot есть функция распознавания лиц. Google также выдает мне что-то об iphoto при поиске функции распознавания лиц. В Picasa тоже есть функция распознавания лиц. Есть ли способы автоматического определения лиц в документе, которые повысили бы производительность на моем рабочем месте за счет сокращения времени, необходимого для нарезки отдельных изображений.
Образец отсканированного документа (реальный документ имеет 5 рядов по 4 изображения в каждом = 20 фотографий): (из:http://www.memorykeeperphoto.com/images/passport_photo.jpg, добросовестное использование)
Например, в Picasa 3.8 при нажатии «Вид» > «Люди» отображаются все лица и предлагается дать им имена. Могу ли я автоматически сохранять эти отдельные фотографии с именами как разные фотографии?
решение1
Автоматическая обрезка фотографий на паспорт звучит определенно выполнимой. Фиксированные условия освещения, всегда лицом вперед, постоянный формат изображения... Я не думаю, что можно было бы желать более благоприятных условий для распознавания лиц.
Я пытался использоватьfacedetectчтобы увидеть результаты на вашем образце изображения:
Паспорта бывают разных форматов и размеров, поэтому они будут упакованы на планшете сканера нерегулярно, но я предполагаю, что вы всегда будете размещать фотографии вертикально. facedetect
даст нам центры и размер всех лиц. В частности, мы можем использовать размер лица и пропорционально обрезать область вокруг него. Поскольку фотографии на паспорт, как правило, занимают фиксированную область фотографии, это кажется относительно безопасным предположением.
Обрезать части изображения очень просто с помощьюImageMagick. Я написал небольшой (и грубый) скрипт для автоматизации процесса:
#!/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
Я эмпирически определил область границы в 60% (во второй строке скрипта) от ширины обнаруженного лица. Вот четыре изображения, которые я получаю:
что уже довольно хорошо. Всегда остается немного пустого пространства сверху, которое я смог удалить, просто добавив "-fuzz 10% -trim" в вызове convert
. Вот результат первого изображения после этого:
Неплохо для быстрого сценария, и есть много возможностей для улучшения. Например, большинство паспортов имеют портретную ориентацию, поэтому имеют разный вертикальный/горизонтальный фактор (обычно 1,3). Кроме того, лица, как правило, слегка смещены вверх (вероятно, на 1,3). Исправление этих ошибок приведет к лучшему кадрированию, избежав необходимости полностью обрезать белое пространство вверху.
Было бы неплохо, если бы вы могли опубликовать (пусть даже в частном порядке) пример планшетного сканирования, чтобы протестировать этот скрипт на реальных выходных данных.
Конечно, это предложение требует установки Linux. Но если я правильно понимаю, не так уж неразумно настроить специальную установку или даже виртуальную машину для автоматизации этой утомительной задачи.
Если конфиденциальность не является проблемой (в чем я сомневаюсь), мне было бы интересно помочь написать достойное решение в обмен на обрезанные лица, которые я бы использовал для улучшения модели распознавания лиц.