Как можно мгновенно извлечь текст из области экрана, используя инструменты OCR?
В Ubuntu 12.10, если я наберу
gnome-screenshot -a | tesseract output
это возвращает:
** Message: Unable to use GNOME Shell's builtin screenshot interface, resorting to fallback X11.
Как выбрать текст на экране и преобразовать его в текст (буфер обмена или документ)?
Спасибо!
9 ответов
Возможно, уже есть какой-то инструмент, который делает это, но вы также можете создать простой скрипт с некоторым инструментом скриншотов и 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://Ask-ubuntu.ru/users/81372/)
# NAME: ScreenOCR
# LICENSE: GNU GPLv3
#
# BASED ON: OCR script by Salem (http://Ask-ubuntu.ru/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, чтобы скрипт работал.
Я создал бесплатную программу с открытым исходным кодом для этой цели:
Не знаю, нужно ли кому-нибудь мое решение. Вот тот, который работает с 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
Этот однострочный сценарий (на основе /questions/677892/capture2text-alternativa-zahvat-teksta-s-ekrana-napryamuyu-v-ubuntu-mate/677899#677899) должен использоваться с сочетанием клавиш, чтобы вы могли работать в любом месте экрана без необходимости открывать терминал, как показано на это изображение.
#!/bin/bash
# Dependencies: convert imagemagick xsel tesseract-ocr-fra [tesseract-ocr-jpn ...]
convert x: -modulate 100,0 -resize 400% -set density 300 png:- |
tesseract stdin stdout -l fra+eng+jpn --psm 3 |
sed 's/'$(printf '%b' '\014')'//g;s/|/I/g' |
xsel -bi
Изменить
--psm
а также
-l
варианты по мере необходимости. Примеры:
-
--psm 10
для изображения с одним символом -
--psm 3
по умолчанию. -
-l fra+eng+jpn
сначала рассмотрим французский, затем английский, затем японский.
Адаптируйте пост-обработку sed к вашим потребностям.
sed 's/'$(printf '%b' '\014')'//g;s/|/I/g'
удаляет символ подачи формы (восьмеричное 014) и заменяет вертикальную черту "|" с "Я".
Используйте стандартные инструкции https://help.ubuntu.com/stable/ubuntu-help/keyboard-shortcuts-set.html.en, чтобы создать сочетание клавиш, которое будет выполнять скрипт. Поместите сценарий в ~/bin или в любое место в переменной среды вашего пути, чтобы не использовать полный путь к вашему сценарию.
Я только что сделал блог о том, как использовать скриншот в наши дни. Несмотря на то, что я нацеливаюсь на китайский, но скриншот и код на английском. 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:
Краткий ответ: https://github.com/SR-Hossain/image2textSR
Подробности: я использую для этого пламенный выстрел, как показано ниже...
sudo apt-get install flameshot
pip install pytesseract pyperclip
sudo nano /image2text.py
Вставьте этот код в image2text.py и сохраните, используя ctrl+x > y > Enter.
from PIL import Image
import pytesseract
import pyperclip
extracted_text = pytesseract.image_to_string(Image.open('/tmp/a.png'))
pyperclip.copy(extracted_text)
Теперь запускайте эту команду всякий раз, когда вы хотите скопировать текст из выбранной части экрана...
rm -f /tmp/a.png && flameshot gui --path /tmp/a.png && python3 /image2text.py
Я создал собственный ярлык (сопоставленный с shift+prtsc) в своем Linux, поэтому я просто нажимаю shift+prtsc всякий раз, когда хочу скопировать текст из файла изображения...
я не смог установить
mogrify
а также
scrot
так вот еще один способ использования
gnome-screenshot
в Убунту. Я добавил сочетание клавиш для запуска команды для запуска моментального снимка в Ubuntu и отправки выходного текста OCR в буфер обмена.
#!/bin/bash
SCR_IMG=".screentemp.jpg"
TEMP_TXT=".screentext.txt"
gnome-screenshot -a --file=$SCR_IMG
tesseract $SCR_IMG $TEMP_TXT -l eng
cat $TEMP_TXT* | xsel -b
rm $SCR_IMG $TEMP_TXT*
Идея заключается в том, что каждый раз, когда новые файлы скриншотов появляются в папке, запустите 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
Я использую следующую команду.
maim -s | convert - -units PixelsPerInch -resample 300 -sharpen 12x6.0 - | tesseract -l eng stdin stdout | sed '$d' | perl -0777 -pe 's/^(\s*\n)+|(\s*\n)+$//g' | xclip -in -selection clipboard
Здесь я использую
sed '$d' | perl -0777 -pe 's/^(\s*\n)+|(\s*\n)+$//g'
чтобы удалить пустые строки в начале и в конце вывода.
Вы также можете использовать norcap , простую программу на Python для конкретной задачи, которую вы ищете.