Come è possibile estrarre istantaneamente il testo da un'area dello schermo utilizzando gli strumenti OCR?


27

In Ubuntu 12.10, se scrivo

gnome-screenshot -a | tesseract output

ritorna:

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

Come posso selezionare un testo dallo schermo e convertirlo in testo (appunti o documento)?

Grazie!


Si ottiene quell'errore usando solo gnome-screenshot -a? Inoltre, perché convoglia l'output su tesseract? Se non sbaglio gnome-screenshot salva l'immagine su un file e non lo "stampa" ...
Salem,

L'avvertimento dovrebbe essere innocuo se guardo attraverso bugzilla. Domanda: qual è il auto-save-directory? E ha lasciato cadere qualcosa? Link interessante: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind

gnome-screenchot -a -c dovrebbe copiare la selezione negli appunti, no? ma il piping su tesseract dà lo stesso errore. la directory predefinita è home / pictures (funziona bene).
Erling,

1
Ho appena fatto questo usando gnome-screenshot - Ho quindi dovuto modificare i file per ridurre la profondità del colore da 16m a 2 (era testo nero su sfondo bianco, ma con il livellamento di carattere di oggi e così via, non era davvero nero ) Quindi ho dovuto ridimensionare l'immagine fino al 200% dell'originale prima di ottenere un OCR accurato da tesseract - ma una volta che l'ho fatto ha funzionato davvero bene.

@SteveLake Ehi Steve, grazie per il suggerimento. Ho modificato lo script per modificare a livello di codice l'immagine come descritto prima di OCR. La velocità di rilevamento dovrebbe ora essere molto migliore.
Glutanimate,

Risposte:


35

Forse c'è già qualche strumento che lo fa, ma puoi anche creare un semplice script con alcuni strumenti di screenshot e tesseract, mentre stai cercando di usare.

Prendi ad esempio questo script (nel mio sistema l'ho salvato come /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

E con il supporto degli appunti:

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

Usa scrotper prendere lo schermo, tesseractriconoscere il testo e catvisualizzare il risultato. La versione degli Appunti utilizza inoltre xselper convogliare l'output negli Appunti.

utilizzo del campione

NOTA : scrot, xsel, imagemagicke tesseract-ocrnon sono installati di default, ma sono disponibili presso i repository di default.

Potresti essere in grado di sostituirlo scrotcon gnome-screenshot, ma potrebbe richiedere molto lavoro. Per quanto riguarda l'output è possibile utilizzare qualsiasi cosa in grado di leggere un file di testo (aprire con l'Editor di testo, mostrare il testo riconosciuto come notifica, ecc.).


Versione GUI dello script

Ecco una semplice versione grafica dello script OCR che include una finestra di selezione della lingua:

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

A parte le dipendenze sopra elencate, per far funzionare lo script è necessario installare il fork YAD Zenity dal PPA webupd8 .


funziona greate nel terminale! grazie! Voglio screencopy codetext dai tutorial per i test. Come usare scrot negli appunti?
Erling,

1
cosa succede con i tempfile?
Erling,

1
I tempfile rimangono lì fino al riavvio del computer. Se questo è un problema per te, puoi semplicemente eliminarli alla fine ( rm $SCR_IMG.png $SCR_IMG.txt).
Salem,

1
scrotda solo non può usare gli appunti. Ma ci sono strumenti come xclipo xselche possono fare ciò di cui hai bisogno se si tratta di copiare / incollare testo.
Salem,

1
Aggiungere alla risposta di Salem: se stai eseguendo KDE, puoi chiamare un altro script per inviare automaticamente il testo che hai generato negli appunti, pronto per incollarlo. Troverai uno script adatto qui . Segui le istruzioni su quella pagina per installare quello script. Quindi tutto ciò che devi fare è aggiungere | clipboardalla fine della riga finale della sceneggiatura di Salem.
Chris,

3

Non so se qualcuno ha bisogno della mia soluzione. Eccone uno che corre con Wayland.

Mostra il riconoscimento dei caratteri in un editor di testo e se aggiungi il parametro "yes" hai ottenuto la traduzione dallo strumento di protezione della maschera (la connessione a Internet è obbligatoria) Prima di poterlo utilizzare installa tesseract-ocr imagemagick e google-trans. Avvia lo script, cioè in gnome con Alt + F2 quando vedi il tuo testo che vuoi riconoscere. Sposta il cursore attorno al testo. Questo è tutto. Questo script è stato testato solo per Gnome. Per altri gestori di finestre dovrebbe essere accomodante. Per tradurre il testo in altre lingue, sostituire l'ID lingua nella riga 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

Ho appena fatto un blog su come utilizzare lo screenshot nei giorni nostri. Anche se mi rivolgo al cinese ma il cast e il codice dello schermo sono in inglese. L'OCR è semplicemente una delle funzionalità.

Funzionalità per il mio OCR:

  • Apri in konsole + vimx O gedit per ulteriori modifiche.

  • Per vimx + inglese, abilita il controllo ortografico.

  • Supporta la selezione dinamica della lingua senza codice fisso.

  • Finestra di dialogo di avanzamento durante la conversione e la tesserazione che è lenta.

Codice funzione:

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

Codice chiamante:

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 &

Combina questo codice 2 in script a shell singola per l'esecuzione.

Schermata 1: inserisci qui la descrizione dell'immagine

Schermata 2: inserisci qui la descrizione dell'immagine


sembra una soluzione decente, ma la leggibilità della tua sceneggiatura è pessima
ukos,

0

L'idea è ogni volta che un nuovo file di screenshot appare nella cartella esegui tesseract OCR su di esso e si apre in un editor di file.

È possibile lasciare questo script in esecuzione nella directory di output della directory di output della schermata preferita

#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

Avrai bisogno di questo per essere istallato

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.