Wie kann mit OCR-Tools sofort Text aus einem Bildschirmbereich extrahiert werden?

27

In Ubuntu 12.10, wenn ich tippe

gnome-screenshot -a | tesseract output

es kehrt zurück:

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

Wie kann ich einen Text auf dem Bildschirm auswählen und in Text (Zwischenablage oder Dokument) konvertieren?

Vielen Dank!

Erling
quelle
Sie bekommen diesen Fehler nur mit gnome-screenshot -a? Auch warum leiten Sie die Ausgabe an tesseract weiter? Wenn ich nicht falsch liege gnome-screenshot speichert das Bild in einer Datei und "druckt" es nicht ...
Salem
Warnung sollte harmlos sein, wenn ich durch Bugzilla schaue. Frage: Was ist das auto-save-directory? Und hat es irgendetwas hineingelegt? Interessanter Link: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind
gnome-screenchot -a -c soll die Auswahl in die Zwischenablage kopieren, oder? Wenn Sie es jedoch an tesseract leiten, tritt der gleiche Fehler auf. Das Standardverzeichnis ist home / pictures (funktioniert gut).
Erling
1
Das habe ich gerade mit gnome-screenshot gemacht - dann musste ich die Dateien bearbeiten, um die Farbtiefe von 16 m auf 2 zu verringern (es war schwarzer Text auf weißem Hintergrund, aber mit der heutigen schicken Glättung von Schriftarten und so weiter war es nicht wirklich schwarz ) Ich musste das Bild dann auf 200% des Originals skalieren, bevor ich eine genaue Texterkennung von tesseract erhielt - aber es funktionierte wirklich gut, wenn ich das getan hatte.
@SteveLake Hey Steve, danke für den Vorschlag. Ich habe das Skript bearbeitet, um das Bild programmgesteuert so zu ändern, wie Sie es vor dem OCR-Vorgang beschrieben haben. Erkennungsrate sollte jetzt viel besser sein.
Glutanimate

Antworten:

35

Möglicherweise gibt es bereits ein Tool, das dies erledigt, aber Sie können auch ein einfaches Skript mit einem Screenshot-Tool und Tesseract erstellen, während Sie versuchen, es zu verwenden.

Nehmen Sie als Beispiel dieses Skript (in meinem System habe ich es gespeichert als /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

Und mit Zwischenablage-Unterstützung:

#!/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

Es scrotnimmt den Bildschirm ein, tesseracterkennt den Text und catzeigt das Ergebnis an. Die Zwischenablage-Version verwendet zusätzlich, xselum die Ausgabe in die Zwischenablage zu leiten.

Probennutzung

HINWEIS : scrot, xsel, imagemagickund tesseract-ocrsind standardmäßig nicht installiert , sondern sind von der der Standard - Repositorys zur Verfügung.

Sie können ersetzen können scrotmit gnome-screenshot, aber es kann eine Menge Arbeit. In Bezug auf die Ausgabe können Sie alles verwenden, was eine Textdatei lesen kann (mit dem Texteditor öffnen, den erkannten Text als Benachrichtigung anzeigen usw.).


GUI-Version des Skripts

Hier ist eine einfache grafische Version des OCR-Skripts mit einem Dialogfeld zur Sprachauswahl:

#!/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

Abgesehen von den oben aufgeführten Abhängigkeiten müssen Sie den Zenity Fork YAD von der webupd8-PPA installieren , damit das Skript funktioniert.

Salem
quelle
funktioniert super im terminal! Danke dir! Ich möchte Codetext aus Tutorials zum Testen screencopy. Wie verwende ich Scrot in die Zwischenablage?
Erling
1
was passiert mit den tempfiles
Erling
1
Die tempfiles bleiben dort, bis Sie Ihren Computer neu starten. Wenn das ein Problem für Sie ist, können Sie sie einfach am Ende löschen ( rm $SCR_IMG.png $SCR_IMG.txt).
Salem
1
scrotallein kann die Zwischenablage nicht verwenden. Aber es gibt Werkzeuge wie xclipoder xseldas kann tun , was Sie brauchen , wenn es sich um Text kopieren / einfügen.
Salem
1
Hinzufügen zu Salems Antwort: Wenn Sie KDE ausführen, können Sie ein anderes Skript aufrufen, um den von Ihnen generierten Text automatisch in die Zwischenablage zu senden und einzufügen. Ein passendes Skript finden Sie hier . Befolgen Sie die Anweisungen auf dieser Seite, um das Skript zu installieren. Dann brauchen Sie nur noch | clipboardam Ende der letzten Zeile von Salems Skript einzufügen.
Chris
3

Ich weiß nicht, ob jemand meine Lösung braucht. Hier ist eine, die mit Wayland läuft.

Es zeigt die Zeichenerkennung in einem Texteditor an und wenn Sie den Parameter "yes" hinzufügen, haben Sie die Übersetzung vom goggle trans-Tool erhalten (Internetverbindung ist erforderlich). Bevor Sie es verwenden können, müssen Sie tesseract-ocr imagemagick und google-trans installieren. Starten Sie das Skript zB in Gnome mit Alt + F2, wenn Sie Ihren zu erkennenden Text sehen. Bewegen Sie den Cursor um den Text. Das ist es. Dieses Skript wurde nur für Gnome getestet. Für andere Fenstermanager muss es Platz bieten. Um den Text in andere Sprachen zu übersetzen, ersetzen Sie die Sprach-ID in Zeile 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
Ronald
quelle
1

Ich habe gerade einen gemacht Blog über die Verwendung von Screenshots in der heutigen Zeit gemacht. Obwohl ich auf Chinesisch ziele, ist die Bildschirmdarstellung und der Code in Englisch. OCR ist nur eine der Funktionen.

Feature für meine OCR:

  • Öffne es in konsole + vimx ODER gedit, um es weiter zu bearbeiten.

  • Aktivieren Sie für vimx + english die Rechtschreibprüfung.

  • Unterstützung der dynamischen Sprachauswahl ohne festen Code.

  • Fortschrittsdialog beim Konvertieren und Tesseracting der langsam ist.

Funktionscode:

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"
}

Anrufercode:

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 &

Kombinieren Sie diesen 2 Code in einem einzelnen Shell-Skript, um ihn auszuführen.

Screenshot 1: Bildbeschreibung hier eingeben

Screenshot 2: Bildbeschreibung hier eingeben

林果 林果
quelle
scheint wie eine anständige Lösung, aber die Lesbarkeit Ihres Skripts ist sehr schlecht
Ukos
0

Die Idee ist, wann immer neue Screenshot-Dateien im Ordner erscheinen, OCR darauf ausführen und in einem Datei-Editor öffnen.

Sie können dieses ausgeführte Skript im Ausgabeverzeichnis Ihres bevorzugten Screenshot-Ausgabeverzeichnisses belassen

#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

Sie benötigen dies, um installiert zu werden

sudo apt install tesseract-ocr
sudo apt install inotify-tools
Eduard Florinescu
quelle