Jak natychmiast wyodrębnić tekst z obszaru ekranu za pomocą narzędzi OCR?


27

W Ubuntu 12.10, jeśli piszę

gnome-screenshot -a | tesseract output

zwraca:

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

Jak mogę wybrać tekst z ekranu i przekonwertować go na tekst (schowek lub dokument)?

Dziękuję Ci!


Ten błąd występuje tylko przy użyciu gnome-screenshot -a? Także dlaczego potokujesz wyjście do tesseract? Jeśli się nie mylę, zrzut ekranu gnome zapisuje zdjęcie w pliku i nie „drukuje” go ...
Salem

Ostrzeżenie powinno być nieszkodliwe, jeśli przejrzę Bugzillę. Pytanie: co to jest auto-save-directory? I czy coś tam wrzuciło? Ciekawy link: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind

gnome-screenchot -a -c ma skopiować zaznaczenie do schowka, prawda? ale przesłanie go do tesseract daje ten sam błąd. domyślny katalog to home / pictures (działa dobrze).
Erling,

1
Właśnie to zrobiłem za pomocą zrzutu ekranu gnome - musiałem edytować pliki, aby zmniejszyć głębię kolorów z 16 m do 2 (był to czarny tekst na białym tle, ale przy dzisiejszym fantazyjnym wygładzaniu czcionek i tak dalej, nie był tak naprawdę czarny ) Następnie musiałem przeskalować obraz do 200% oryginału, zanim uzyskałem dokładny OCR od tesseract - ale zadziałało naprawdę dobrze, kiedy to zrobiłem.

@ SteveLake Cześć Steve, dziękuję za sugestię. Zredagowałem skrypt, aby programowo zmodyfikować obraz w sposób opisany przed OCRingiem. Wskaźnik wykrywalności powinien być teraz znacznie lepszy.
Glutanimate,

Odpowiedzi:


35

Być może jest już jakieś narzędzie, które to robi, ale możesz również utworzyć prosty skrypt za pomocą narzędzia do zrzutów ekranu i tesseract, gdy próbujesz użyć.

Weźmy jako przykład ten skrypt (w moim systemie zapisałem go jako /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

I ze wsparciem schowka:

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

Służy scrotdo robienia ekranu, tesseractrozpoznawania tekstu i catwyświetlania wyniku. Wersja schowka dodatkowo wykorzystuje xselpotok wyjściowy do schowka.

przykładowe użycie

UWAGA : scrot, xsel, imagemagicki tesseract-ocrnie są instalowane domyślnie, ale są dostępne w domyślnych repozytoriach.

Możesz być w stanie wymienić scrotz gnome-screenshot, ale może to zająć dużo pracy. Jeśli chodzi o dane wyjściowe, możesz użyć wszystkiego, co może odczytać plik tekstowy (otwórz za pomocą Edytora tekstu, pokaż rozpoznany tekst jako powiadomienie itp.).


Wersja skryptu z graficznym interfejsem użytkownika

Oto prosta graficzna wersja skryptu OCR, w tym okno dialogowe wyboru języka:

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

Oprócz wyżej wymienionych zależności musisz zainstalować widelec Zenity YAD z PPA webupd8, aby skrypt działał.


działa greate w terminalu! Dziękuję Ci! Chcę zeskanować tekst kodowy z samouczków w celu przetestowania. Jak używać Scrot do schowka?
Erling,

1
co dzieje się z plikami tymczasowymi?
Erling,

1
Pliki tymczasowe pozostają tam do momentu ponownego uruchomienia komputera. Jeśli jest to dla ciebie problem, możesz po prostu usunąć je na końcu ( rm $SCR_IMG.png $SCR_IMG.txt).
Salem,

1
scrotsam w sobie nie może korzystać ze schowka. Ale istnieją narzędzia, takie jak xcliplub xselże może robić to, co trzeba, jeśli jest do kopiowania / wklejania tekstu.
Salem,

1
Dodanie do odpowiedzi Salema: Jeśli używasz KDE, możesz wywołać inny skrypt, aby automatycznie wysłać wygenerowany tekst do schowka, gotowy do wklejenia. Znajdziesz odpowiedni skrypt tutaj . Postępuj zgodnie z instrukcjami na tej stronie, aby zainstalować ten skrypt. Następnie wystarczy dodać | clipboardna końcu ostatniego wiersza skryptu Salem.
Chris

3

Nie wiem, czy ktoś potrzebuje mojego rozwiązania. Oto taki, który biegnie z Waylandem.

Pokazuje rozpoznawanie znaków w edytorze tekstu, a jeśli dodasz parametr „tak”, otrzymasz tłumaczenie z narzędzia goggle trans (połączenie internetowe jest obowiązkowe). Zanim będziesz mógł z niego korzystać, zainstaluj tesseract-ocr imagemagick i google-trans. Uruchom skrypt, tj. W gnome z Alt + F2, gdy zobaczysz tekst, który chcesz rozpoznać. Przesuń kursor wokół tekstu. To jest to. Ten skrypt został przetestowany tylko dla gnome. W przypadku innego menedżera okien musi być to możliwe. Aby przetłumaczyć tekst na inne języki, zastąp identyfikator języka w wierszu 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

Właśnie napisałem blog na temat korzystania ze zrzutów ekranu we współczesnych czasach. Mimo że kieruję reklamy na język chiński, ale obsada ekranu i kod są w języku angielskim. OCR jest tylko jedną z funkcji.

Funkcja mojego OCR:

  • Otwórz w konsoli + vimx LUB gedit, aby dalej edytować.

  • W przypadku vimx + angielskiego włącz sprawdzanie pisowni.

  • Obsługuje dynamiczny wybór języka bez twardego kodu.

  • Postępuj w oknie dialogowym, gdy konwersja i tesseracting są powolne.

Kod funkcji:

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

Kod dzwoniącego:

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 &

Połącz ten 2 kod w skrypcie z pojedynczą powłoką, aby uruchomić.

Zrzut ekranu 1: wprowadź opis zdjęcia tutaj

Zrzut ekranu 2: wprowadź opis zdjęcia tutaj


wydaje się być
dobrym

0

Chodzi o to, że za każdym razem, gdy w folderze pojawią się nowe pliki zrzutu ekranu, uruchom na nim tesseract OCR i otwórz w edytorze plików.

Możesz zostawić uruchomiony skrypt w katalogu wyjściowym swojego ulubionego katalogu wyjściowego zrzutu ekranu

#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

Będziesz potrzebował tego do instalacji

sudo apt install tesseract-ocr
sudo apt install inotify-tools

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.