Как можно мгновенно извлечь текст из области экрана, используя инструменты OCR?

27

В Ubuntu 12.10, если я наберу

gnome-screenshot -a | tesseract output

это возвращает:

** Message: Unable to use GNOME Shell's builtin screenshot interface, resorting to fallback X11.

Как выбрать текст на экране и преобразовать его в текст (буфер обмена или документ)?

Спасибо!

Эрлинг
источник
Вы получаете эту ошибку, используя только gnome-screenshot -a? Кроме того, почему вы передаете вывод в tesseract? Если я не ошибаюсь, gnome-screenshot сохраняет изображение в файл и не «печатает» его ...
Salem
Предупреждение должно быть безвредным, если я просматриваю багзиллу. Вопрос: что это auto-save-directory? И что-нибудь там упало? Интересная ссылка: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind,
gnome-screenchot -a -c должен копировать выделение в буфер обмена, не так ли? но передача его в tesseract дает ту же ошибку. каталог по умолчанию - home / pictures (работает хорошо).
Эрлинг
1
Просто сделайте это с помощью gnome-screenshot - мне нужно было отредактировать файлы, чтобы уменьшить глубину цвета с 16 до 2 (это был черный текст на белом фоне, но с сегодняшним причудливым сглаживанием шрифтов и т. Д. Он не был действительно черным Затем мне пришлось масштабировать изображение до 200% от оригинала, прежде чем я получил точное распознавание текста от тессеракта - но когда я это сделал, это сработало очень хорошо.
@ SteveLake Привет, Стив, спасибо за предложение. Я отредактировал скрипт, чтобы программно изменить изображение так, как вы его описали, перед тем, как его распознать. Скорость обнаружения теперь должна быть намного лучше.
Glutanimate

Ответы:

35

Возможно, уже есть какой-то инструмент, который делает это, но вы также можете создать простой скрипт с некоторым инструментом скриншотов и tesseract, который вы пытаетесь использовать.

Возьмите в качестве примера этот скрипт (в моей системе я сохранил его как /usr/local/bin/screen_ts):

#!/bin/bash
# Dependencies: tesseract-ocr imagemagick scrot

select tesseract_lang in eng rus equ ;do break;done
# Quick language menu, add more if you need other languages.

SCR_IMG=`mktemp`
trap "rm $SCR_IMG*" EXIT

scrot -s $SCR_IMG.png -q 100 
# increase quality with option -q from default 75 to 100
# Typo "$SCR_IMG.png000" does not continue with same name.


mogrify -modulate 100,0 -resize 400% $SCR_IMG.png 
#should increase detection rate

tesseract $SCR_IMG.png $SCR_IMG &> /dev/null
cat $SCR_IMG.txt
exit

И с поддержкой буфера обмена:

#!/bin/bash 
# Dependencies: tesseract-ocr imagemagick scrot xsel

select tesseract_lang in eng rus equ ;do break;done
# quick language menu, add more if you need other languages.

SCR_IMG=`mktemp`
trap "rm $SCR_IMG*" EXIT

scrot -s $SCR_IMG.png -q 100    
# increase image quality with option -q from default 75 to 100

mogrify -modulate 100,0 -resize 400% $SCR_IMG.png 
#should increase detection rate

tesseract $SCR_IMG.png $SCR_IMG &> /dev/null
cat $SCR_IMG.txt | xsel -bi

exit

Он используется, scrotчтобы взять экран, tesseractраспознать текст и catотобразить результат. Версия буфера обмена дополнительно использует xselдля передачи вывода в буфер обмена.

пример использования

Примечание : scrot, xsel, imagemagickи tesseract-ocrне установлены по умолчанию , но доступны из хранилищ по умолчанию.

Вы можете быть в состоянии заменить scrotс gnome-screenshot, но это может занять много работы. Что касается вывода, вы можете использовать все, что может читать текстовый файл (открыть в текстовом редакторе, показать распознанный текст как уведомление и т. Д.).


GUI версия скрипта

Вот простая графическая версия сценария OCR, включая диалог выбора языка:

#!/bin/bash
# DEPENDENCIES: tesseract-ocr imagemagick scrot yad
# AUTHOR:       Glutanimate 2013 (http://askubuntu.com/users/81372/)
# NAME:         ScreenOCR
# LICENSE:      GNU GPLv3
#
# BASED ON:     OCR script by Salem (http://askubuntu.com/a/280713/81372)

TITLE=ScreenOCR # set yad variables
ICON=gnome-screenshot

# - tesseract won't work if LC_ALL is unset so we set it here
# - you might want to delete or modify this line if you 
#   have a different locale:

export LC_ALL=en_US.UTF-8

# language selection dialog
LANG=$(yad \
    --width 300 --entry --title "$TITLE" \
    --image=$ICON \
    --window-icon=$ICON \
    --button="ok:0" --button="cancel:1" \
    --text "Select language:" \
    --entry-text \
    "eng" "ita" "deu")

# - You can modify the list of available languages by editing the line above
# - Make sure to use the same ISO codes tesseract does (man tesseract for details)
# - Languages will of course only work if you have installed their respective
#   language packs (https://code.google.com/p/tesseract-ocr/downloads/list)

RET=$? # check return status

if [ "$RET" = 252 ] || [ "$RET" = 1 ]  # WM-Close or "cancel"
  then
      exit
fi

echo "Language set to $LANG"

SCR_IMG=`mktemp` # create tempfile
trap "rm $SCR_IMG*" EXIT # make sure tempfiles get deleted afterwards

scrot -s $SCR_IMG.png -q 100 #take screenshot of area
mogrify -modulate 100,0 -resize 400% $SCR_IMG.png # postprocess to prepare for OCR
tesseract -l $LANG $SCR_IMG.png $SCR_IMG # OCR in given language
cat $SCR_IMG | xsel -bi # pass to clipboard
exit

Помимо перечисленных выше зависимостей вам нужно будет установить Zenity fork YAD из PPA webupd8, чтобы скрипт работал.

Salem
источник
работает отлично в терминале! Спасибо! Я хочу скопировать кодовый текст из учебников для тестирования. Как использовать Scrot в буфер обмена?
Эрлинг
1
что происходит с временными файлами?
Эрлинг
1
Tempfiles остаются там, пока вы не перезагрузите компьютер. Если это проблема для вас, вы можете просто удалить их в конце ( rm $SCR_IMG.png $SCR_IMG.txt).
Салем
1
scrotсам по себе не может использовать буфер обмена. Но есть инструменты, подобные xclipили xselкоторые могут делать то, что вам нужно, если это копировать / вставлять текст.
Салем
1
Добавление к ответу Салема: если вы работаете с KDE, вы можете вызвать другой скрипт, чтобы автоматически отправить сгенерированный вами текст в буфер обмена, готовый для вставки. Вы найдете подходящий сценарий здесь . Следуйте инструкциям на этой странице, чтобы установить этот скрипт. Тогда все, что вам нужно, это добавить | clipboardв конец финальной строки сценария Салема.
Крис
3

Не знаю, нужно ли кому-нибудь мое решение. Вот тот, который работает с Wayland.

Он показывает распознавание символов в текстовом редакторе, и если вы добавите параметр «да», вы получите перевод из инструмента goggle trans (подключение к Интернету обязательно). Перед тем, как вы сможете его использовать, установите tesseract-ocr imagemagick и google-trans. Запустите скрипт, т.е. в gnome, с помощью Alt + F2, когда увидите текст, который хотите распознать. Переместите курсор вокруг текста. Это оно. Этот сценарий был проверен только для гномов. Для другого оконного менеджера это должно быть приспособлено. Для перевода текста на другие языки замените идентификатор языка в строке 25.

#!/bin/bash
# Dependencies: tesseract-ocr imagemagick google-trans

translate="no"
translate=$1

SCR_IMG=`mktemp`
trap "rm $SCR_IMG*" EXIT

gnome-screenshot -a -f $SCR_IMG.png  
# increase quality with option -q from default 75 to 100
# Typo "$SCR_IMG.png000" does not continue with same name.


mogrify -modulate 100,0 -resize 400% $SCR_IMG.png 
#should increase detection rate

tesseract $SCR_IMG.png $SCR_IMG &> /dev/null

if [ $translate = "yes" ] ; then

        trans :de file://$SCR_IMG.txt -o $SCR_IMG.translate.txt
        gnome-text-editor $SCR_IMG.translate.txt
        else
        gnome-text-editor $SCR_IMG.txt
fi

exit
Рональд
источник
1

Я только что сделал блог о том, как использовать скриншот в наши дни. Несмотря на то, что я нацеливаюсь на китайский, но скриншот и код на английском. OCR - это всего лишь одна из функций.

Особенность для моего OCR:

  • Откройте konsole + vimx ИЛИ gedit для дальнейшего редактирования.

  • Для vimx + english включите проверку правописания.

  • Поддержка динамического выбора языка без жесткого кода.

  • Диалог прогресса при конвертации и тессеракте, который идет медленно.

Код функции:

function ocr () {
    tmpj="$1"
    tmpocr="$2"
    tmpocr_p="$3"
    atom="$(tesseract --list-langs 2>&1)"; atom=(`echo "${atom#*:}"`); atom=(`echo "$(printf 'FALSE\n%s\n' "${atom[@]}")"`); atom[0]='True'
    ans=(`yad --center --height=200 --width=300 --separator='|' --on-top --list --title '' --text='Select Languages:' --radiolist --column '✓' --column 'Languages' "${atom[@]}" 2>/dev/null`) && ans="$(echo "${ans:5:-1}")" &&  convert "$tmpj[x2000]" -unsharp 15.6x7.8+2.69+0 "$tmpocr_p" | yad --on-top --title '' --text='Converting ...' --progress --pulsate --auto-close 2>/dev/null && tesseract "$tmpocr_p" "$tmpocr" -l "$ans" 2>>/tmp/tesseract.log | yad --percentage=50 --on-top --title '' --text='Tesseracting ...' --progress --pulsate --auto-close 2>/dev/null && if [[ "$ans" == 'eng' ]]; then konsole -e "vimx -c 'setlocal spell spelllang=en_us' -n $tmpocr.txt" 2>/dev/null; else gedit "$tmpocr.txt"; fi
    rm "$tmpocr_p"
}

Код звонящего:

for cmd in "mktemp" "convert" "tesseract" "gedit" "konsole" "vimx" "yad"; do 
    command -v $cmd >/dev/null 2>&1 || {  LANG=POSIX; xmessage "Require $cmd but it's not installed.  Aborting." >&2; exit 1; }; :;
done
tmpj="$(mktemp /tmp/`date +"%s_%Y-%m-%d"`_XXXXXXXXXX.png)"
tmpocr="$(mktemp -u /tmp/`date +"%s_%Y-%m-%d"`_ocr_XXXXX)"
tmpocr_p="$tmpocr"+'.png'
gnome-screenshot -a -f "$tmpj" 2>&1 >/dev/null | ts >>/tmp/gnome_area_PrtSc_error.log
ocr $tmpj $tmpocr $tmpocr_p &

Объедините эти 2 кода в один сценарий оболочки для запуска.

Снимок экрана 1: введите описание изображения здесь

Снимок экрана 2: введите описание изображения здесь

林果 皞
источник
кажется неплохим решением, но читаемость вашего сценария очень плохая
ukos
0

Идея заключается в том, что каждый раз, когда новые файлы скриншотов появляются в папке, запустите tesseract OCR и открывайте их в редакторе файлов.

Вы можете оставить этот работающий скрипт в выходной директории вашей любимой выходной директории скриншотов

#cat wait_for_it.sh
inotifywait -m . -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        cd "$path"
        if [ ${file: -4} == ".png" ]; then
                tesseract "$file" "$file"
                sleep 1
                gedit "$file".txt &
        fi

    done

Вам нужно, чтобы это было установлено

sudo apt install tesseract-ocr
sudo apt install inotify-tools
Эдуард Флоринеску
источник