Як можна миттєво витягнути текст із області екрана за допомогою інструментів 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 зберігає зображення у файлі, а не "друкує" його ...
Salem,

Попередження має бути нешкідливим, якщо я дивлюся через баггілу. Питання: що таке auto-save-directory? І це щось кинуло туди? Цікаве посилання: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind

gnome-screenchot -a -c повинен скопіювати вибір у буфер обміну, чи не так ?. але трубопровід до тессеракта дає ту саму помилку. за замовчуванням каталог - home / images (добре працює).
Ерлінг

1
Щойно робив це за допомогою gnome-скріншот - мені тоді довелося редагувати файли, щоб зменшити глибину кольору з 16 м до 2 (це був чорний текст на білому тлі, але з сучасним вирівнюванням шрифту та ін., Він насправді не був чорним ) Потім мені довелося масштабувати зображення до 200% від оригіналу, перш ніж я отримав точний OCR від tesseract - але це спрацювало дуже добре, як тільки я це зробив.

@SteveLake Ей Стів, дякую за пропозицію. Я відредагував сценарій, щоб програмно модифікувати зображення таким чином, як ви описали, перш ніж OCRing. Швидкість виявлення тепер повинна бути значно кращою.
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 від webupd8 PPA, щоб сценарій працював.


працює смазка в терміналі! Дякую тобі! Я хочу скріпити копіювання кодексу з навчальних посібників для тестування. Як використовувати мошонку до буфера обміну?
Ерлінг

1
що трапляється із тимчасовими файлами?
Ерлінг

1
Тимфіли залишаються там, доки не перезавантажите комп'ютер. Якщо це проблема для вас, ви можете просто видалити їх у кінці ( rm $SCR_IMG.png $SCR_IMG.txt).
Салем

1
scrotсам по собі не може використовувати буфер обміну. Але є такі інструменти , як xclipі xselщо може робити те , що вам потрібно , якщо це необхідно скопіювати / вставити текст.
Салем

1
Додавання до відповіді Салема: Якщо ви працюєте з KDE, ви можете зателефонувати іншому сценарію, щоб автоматично надіслати створений текст до буфера обміну, готового вставити. Ви знайдете відповідний сценарій тут . Дотримуйтесь інструкцій на цій сторінці, щоб встановити цей скрипт. Тоді все, що вам потрібно, це додати | clipboardдо кінця заключного рядка сценарію Салема.
Кріс

3

Не знаю, чи хтось потребує мого рішення. Ось такий, який працює з пути.

Він показує розпізнавання символів у текстовому редакторі, і якщо ви додасте параметр "так", ви отримали переклад від інструменту goggle trans (підключення до Інтернету є обов'язковим) Перед тим, як використовувати його, можна встановити tesseract-ocr imagemagick та google-trans. Запустіть сценарій, тобто в gnome, з Alt + F2, коли побачите текст, який потрібно розпізнати. Перемістіть курсив навколо тексту. Це воно. Цей сценарій був testetd лише для gnome. Для інших менеджерів вікон він повинен бути розміщений. Для перекладу тексту іншими мовами замініть ідентифікатор мови у рядку 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.