LINUX.ORG.RU
ФорумAdmin

bash скрипт+распознавание текста+и массовое переименнование

 , ,


2

2

Задача следующая, которую хочу оптимизировать с помощью bash скрипта. Хочу предупредить что я в этом деле малознающий.

Есть каталог со сканированными изображениями в формате: сканирование.jpg сканирование1.jpg ... сканированиеN.jpg. В этих *jpg есть строка где указана фамилия имя отчество. Необходимо: эту строку распознать как текст и переименовать этот *jpg в котором распознавали и так все остальные...

Как вижу решения я(может и немного некорректное): С помощью imagemagic кадрировать строку с ФИО командой #convert -crop 830x60+80+235 input.jpg output.jpg в отдельный каталог и уже в этом каталоге с помощью #tesseract output.jpg 1.txt расспознавать текст, который потом необходимо использовать в названиях *jpg .

Далее я не знаю что мне делать. Будьте добры, помогите или скажите какого хода мыслей мне придерживаться?! Заранее спасибо!

Уточнение

То есть, у вас есть файлы 1.txt... N.txt, в которых есть нужные вам ФИО? и вам нужно эти данные применить?

Или вам нужно подсказать с начала и до конца как на баше это все проделать? от обрезания кусочка картинки ,ее распознавания?

firefedot ()
Ответ на: Уточнение от firefedot

Если просто текст использовать, то что-то такое:

name=$(cat 1.txt)
mv сканирование1.jpg "$name".jpg

это все с цикл, как вариант, и вперед)

firefedot ()
Ответ на: комментарий от firefedot

На примере одного файла

вот так на примере одного файла

Создал картинку с содержимым: «Иванов Иван Иванович» - , правда в png, но не суть.

И проделала, что вам требуется.

#!/bin/bash

img="сканирование1.png"
txt="1" # он сам вроде .txt  добавляет
tesseract "$img" "$txt"

name=$(cat $txt.txt)
mv $img "$name".jpg

на выходе получил файл 'Иванов Иван Иванович.jpg'

Вот)

firefedot ()

И хотя во временных файлах не так много и плохого, здесь ни один из обоих не нужен — передавайте по конвейеру.

Zmicier ★★★★★ ()
Ответ на: комментарий от firefedot

из tesseract по-моему не получится конвеером

Почему?

#!/bin/bash

for f; do
    ocr=$(convert -crop 830x60+80+235 "$f" jpg:- | tesseract -l rus - -)
    [[ $ocr == *' '*' '* ]] || continue
    mv "$f" "$ocr.jpg"
done
Zmicier ★★★★★ ()
Ответ на: На примере одного файла от firefedot

Спасибо за вашу помощь, но у меня не один файл *.jpg, а их много в каналоге. Вот пытался изобразить: сканирование.jpg сканирование1.jpg ... сканированиеN.jpg.

И файл 1.txt для переименнования файлов мне надо еще получить путем распознавания строки *jpg где указано ФИО

isaecf ()
Ответ на: комментарий от Zmicier

У Вас интересная реализация, но почему то ничего не происходит. Хочу уточнить некоторые моменты: Изображения *.jpg надо помещать туда же где и скрипт находится ?

isaecf ()
#!/bin/sh
for filename in *.jpg; do
    newfilename = $(convert -crop 830x60+80+235 "$filename" - | tesseract stdin stdout).jpg
    echo mv "$filename" "$newfilename"
done

Так — тестить. Реально переименовывать — убрать echo перед mv.

Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 5)
Ответ на: комментарий от vodz

Да. Ошибся. Спасибо за исправление. Пробелы надо убрать.

Psych218 ★★★★★ ()
Ответ на: комментарий от isaecf

но почему то ничего не происходит

Не вижу. УМВР.

Изображения *.jpg надо помещать туда же где и скрипт находится?

Нет, конечно. О_о Как вам вообще такое в голову пришло — перемещать куда-то файлы, когда их надо обработать?

Все файлы передаете аргументами:

$ isaecf-ocr-rename *.jpg
Zmicier ★★★★★ ()
Ответ на: комментарий от Psych218

tesseract stdin stdout

Какая прлсть.... Вы не знаете фамилию того, кто это придумал?

Zmicier ★★★★★ ()
Ответ на: комментарий от isaecf

С чего вы взяли, что переменные? Это прлстный синтаксис Тессеракта. Но нормальный он тоже умеет, я же выше написал.

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

Всем огромное спасибо!!!! Мне осталось откалибровать попадания imagemagic в строку с ФИО. Скажите где почитать такую литературу, чтобы можно было самостоятельно разбираться с bash скриптами ?

isaecf ()
Ответ на: комментарий от isaecf

нет такой литературы...это тайное знание, передаваемое из уст в уста, от пятизвёздочного отца к однозвёздночному сыну...

zolden ★★★★★ ()
Ответ на: комментарий от isaecf

Всегда пожалуйста.

откалибровать попадания

А в чем вообще необходимость «целится»? На фотографиях есть еще какие-то надписи?

литературу

Грега Вулиджа, наверное.

И про сопроводительную документацию не забывайте. Ну, которая (info "bash") / $ info bash.

Менделя Купера не читайте.

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

А в чем вообще необходимость «целится»?

Если это фото задержанных, то на табличках должны быть специальные метки для этого прицельного сканирования :))

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Вся проблема в том, что такое сканирование провожу каждый день на МФУ через лоток автоматической подачи. Естественно, листы для сканирования в лотки затягиваются не всегда ровно и, естественно, координаты строки на «сканирование1.jpg» отличается от «сканирование2.jpg». Конечно, сканирование со стекла решает эту проблему, но это занимает больше времени...

Поэтому вопрос: может есть решение, когда на листе находим метку или букву (с которой все листы начинаются) и уже с этой метки начинаем кадрирование и далее переименование...

isaecf ()
Ответ на: комментарий от isaecf

Вариант

А если использовать бумажный шаблон?

Правда сканировать придется два раза, но зато, получишь чисто скан с нужными буквами, если они на всех документах в одном месте

не? так не получиться?

firefedot ()
Ответ на: комментарий от isaecf

В таком случае мне уже проще сканировать РОВНО со стекла и тем скриптом что мне тут описали кадрировать и переименовывать

isaecf ()
Ответ на: комментарий от isaecf

а если распознавать весь текст, а потом скриптом же выбирать только ту часть, которая нужна? grep'ом, например

anonymous ()
Ответ на: комментарий от anonymous

Как вариант! Перед ФИО всегда присутствует «Я, ...». Может как-то от этой буквы начинать распознавать текст. И надо учитывать, что в этом документе присутствует и фото и английские символы. Я не знаю чем в этом случае распознавать если говорить о bash скрипте...

isaecf ()
Ответ на: комментарий от isaecf

grep отлично ищет любые строки в текстовых файлах. он использует регулярные выражения.

если скинешь сюда пример распознанного текста, то помогу составить регулярку. используй теги [code]...текст...[/code], чтобы текст выглядел как в файле.

anonymous ()
Ответ на: комментарий от anonymous

К сожалению не могу такие документы Вам отправить. Сможете привести примеры использования grep именно для таких целей ?

isaecf ()
Ответ на: комментарий от isaecf

попробуй заменить строчку ocr=... в скрипте на

ocr=$(tesseract -l rus "$f" - | sed -nr 's/.*Я, ([^ ]* [^ ]* [^ ]*).*/\1/p; T lab; q; :lab')

.*Я, ([^ ]* [^ ]* [^ ]*).* - вот это вот регулярка. .* означает любое количество любых символов, [^ ]* означает любое количество символов, отличных от пробела. то, что заключено в скобки будет выведено.

anonymous ()
Ответ на: комментарий от isaecf

Скажите где почитать такую литературу, чтобы можно было самостоятельно разбираться с bash скриптами ?

man bash
«Advansed Bash Scripting Guide»

teod0r ★★★★★ ()
Ответ на: комментарий от anonymous

Т.е. должно быть вида ??

for f; do ocr=$(tesseract -l ukr «$f» - | sed -nr 's/.*Я, ([^ ]* [^ ]* [^ ]*).*/\1/p; T lab; q; :lab') [[ $ocr == *' '*' '* ]] || continue mv «$f» «$ocr.jpg» done

Если ДА, то ничего не происходит((((

isaecf ()
Ответ на: комментарий от isaecf

ну да. ну я хз. попробуй оттестировать по отдельности каждую команду в консоли:

tesseract -l ukr scan.jpg text.txt
# проверь как распознался весь текст

sed -nr 's/.*Я, ([^ ]* [^ ]* [^ ]*).*/\1/p; T lab; q; :lab' text.txt
# в консоль должно вывестись фио из файла text.txt

возможно запятая распознаётся как точка, тогда можно попробовать вместо неё в регулярке поставить точку, которая будет означать «один любой символ».

anonymous ()
Ответ на: комментарий от anonymous

Отлично! В саму консоль идет выхлоп ФИО как положено. Осталось разобраться как эти выхлопы стопкой файлы переименовать. Будьте добры мне и в этом разобраться...

isaecf ()
Ответ на: комментарий от isaecf
#!/bin/bash

for f; do
    fio=$(tesseract -l ukr "$f" - | sed -nr 's/.*Я, ([^ ]* [^ ]* [^ ]*).*/\1/p; T lab; q; :lab')
    if [ -z "$fio" ]; then
        echo ФИО не найдены в файле \"$f\"
    else
        mv "$f" "$fio.jpg"
    fi
done
anonymous ()
Ответ на: комментарий от anonymous

там будет запятая после фио захватываться, надо поменять третью [^ ] в регулярке на [^ ,].

anonymous ()
Ответ на: комментарий от isaecf

а как ты запускаешь скрипт? где он у тебя находится? он исполняемый? назначь его исполняемым, сохрани в папку /usr/local/bin/ и запускай из папки со сканами:

# допустим твой скрипт находится в ~ и ты назвал его "ocr-rename.sh"

# назначить исполняемым:
chmod +x ~/ocr-rename.sh

# сохранить в /usr/local/bin/:
sudo cp ~/ocr-rename.sh /usr/local/bin/

# перейти в папку со сканами (например ~/scans)
cd ~/scans

# выполнить скрипт
ocr-rename.sh *.jpg

если будешь вносить изменения в скрипт, то его надо будет снова сохранять в /usr/local/bin/ из-под суперпользователя.

anonymous ()
Ответ на: комментарий от isaecf

Понял))) немного добавил в начале и работает))

#!/bin/bash for f in ./input_picture/*.jpg; do fio=$(tesseract -l ukr «$f» - | sed -nr 's/.*Я, ([^ ]* [^ ]* [^ ]*).*/\1/p; T lab; q; :lab') if [ -z «$fio» ]; then echo ФИО не найдены в файле \«$f\» else mv «$f» "./output_picture/$fio.jpg" fi done

Но лени нет предела. Если поможете еще улучшить этот скрипт буду очень благодарен)) Я так понимаю что ФИО будут выбираться если она состоит только из трех слов, но бывают граждане у которых ФИО состоит из 5ти слов или более...

tesseract обрабатывает так этот документ, что ФИО заключена между словами «Я,» ФИО «Фото». Можно ли сделать так чтобы все слова выбирались между этими символами ?

isaecf ()
Ответ на: комментарий от isaecf

конечно, замени регулярку .*Я, ([^ ]* [^ ]* [^ ]*).* на .*Я, (.*) Фото.*. если не хочешь, чтобы какие-то символы попадали в вывод, замени точку в скобках на [^символы]. андерстенд?

даже если в фио будет «фото», то оно попадёт в вывод.

anonymous ()
Ответ на: комментарий от anonymous

После последнего редактирования не срабатывает. В Bash вывод: ФИО не найдены в файле "./input_picture/ГОЛОВАШКІНА Г.С.jpg" ФИО не найдены в файле "./input_picture/ГОЛОВАШКІН П.О.jpg"

Вот какой скрипт сейчас #!/bin/bash for f in ./input_picture/*.jpg; do fio=$(tesseract -l ukr «$f» - | sed -nr 's/.*Я, (.*)Фото.*/\1/p; T lab; q; :lab') if [ -z «$fio» ]; then echo ФИО не найдены в файле \«$f\» else mv «$f» "./output_picture/$fio.jpg" fi done

P.S. И еще вопрос: как участники на этом форуме вставляет код что он нормально читабельный, а не съежается в одно строчку как у меня ?

isaecf ()
Ответ на: комментарий от isaecf

ну хз. скинь на pastebin.com или bpaste.net то, что распознаёт tesseract, я тебе составлю нормальную регулярку. так, в слепую, долго будем переписываться.

про разметку в комментариях вот тут написано: www.linux.org.ru/help/lorcode.md

используй [code][/code] для форматирования кода.

anonymous ()
Ответ на: комментарий от isaecf

В том то и дело что не могу этот документ скинуть...

Судя по «Я, ...» вы случаем не криминальную камеру установили и сканируете заявления с лицами?

vodz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.