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は画像をファイルに保存し、それを「印刷」しません
セーラム

bugzillaを調べれば、警告は無害です。質問:何auto-save-directoryですか?そして、それはそこに何かを落としましたか?興味深いリンク:forums.debian.net/viewtopic.php?f
6

gnome-screenchot -a -cは選択範囲をクリップボードにコピーするはずですよね。しかし、それをtesseractにパイプすると同じエラーが発生します。デフォルトのディレクトリはhome / picturesです(うまく機能します)。
アーリング

1
ちょうどgnome-screenshotを使用してこれを行いました-その後、ファイルを編集して色深度を16mから2に減らす必要がありました(白い背景に黒のテキストでしたが、今日の派手なフォントスムージングなどにより、本当に黒ではありませんでした))その後、tesseractから正確なOCRを取得する前に、元の画像の200%まで画像を拡大する必要がありましたが、一度それを行うと、うまく機能しました。

@SteveLakeちょっとスティーブ、提案をありがとう。スクリプトを編集して、OCRを実行する前に説明した方法で画像をプログラムで変更しました。これで、検出率が大幅に向上するはずです。
グルタニメート

回答:


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、出力をクリップボードにパイプするために利用します。

サンプル使用法

scrotxselimagemagickおよびtesseract-ocrデフォルトではインストールされていないが、デフォルトのリポジトリから入手できます。

あなたは置き換えることができるかもしれscrotgnome-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

上記の依存関係とは別に、スクリプトを機能させるには、webupd8 PPAからZenity fork YADをインストールする必要があります。


ターミナルで素晴らしい作品!ありがとうございました!テスト用のチュートリアルからコードテキストをスクリーンコピーしたい。scrotを使用してクリップボードに入れる方法は?
アーリング

1
一時ファイルはどうなりますか?
アーリング

1
一時ファイルは、コンピューターを再起動するまでそこに残ります。それが問題になる場合は、最後に削除するだけです(rm $SCR_IMG.png $SCR_IMG.txt)。
セーラム

1
scrotそれ自体ではクリップボードを使用できません。ただし、テキストのコピー/貼り付けを行う場合に必要なことを行うツールxclipやツールxselがあります。
セーラム

1
Salemの答えに追加:KDEを実行している場合は、別のスクリプトを呼び出して、生成したテキストをクリップボードに自動的に送信して、貼り付けの準備をすることができます。適切なスクリプトがここにあります。そのページの指示に従って、そのスクリプトをインストールします。その後、必要なのは| clipboard、Salemのスクリプトの最終行の最後に追加することだけです。
クリス

3

誰かが私のソリューションを必要とするかどうかわからない。これがウェイランドで実行されるものです。

テキストエディターで文字認識を表示し、「yes」パラメーターを追加すると、ゴーグルトランスツールから翻訳が得られます(インターネット接続が必須です)。使用する前に、tesseract-ocr imagemagickおよびgoogle-transをインストールします。認識したいテキストが表示されたら、Alt + F2でgnomeでスクリプトを開始します。コースラーをテキストの周りに移動します。それでおしまい。このスクリプトはgnome専用です。他のウィンドウマネージャーの場合は、対応する必要があります。他の言語のテキストを翻訳するには、25行目の言語IDを置き換えます。

#!/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は単なる機能の1つです。

OCRの機能:

  • konsole + vimxまたはgeditで開き、さらに編集します。

  • vimx + englishの場合、スペルチェックを有効にします。

  • ハードコードなしで動的な言語選択をサポートします。

  • 変換およびtesseractingの進行ダイアログが遅い。

機能コード:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.