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

25

In Ubuntu 12.10, se digito

gnome-screenshot -a | tesseract output

restituisce:

** 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!

    
posta Erling 12.04.2013 - 00:11

3 risposte

30

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

Prendi come 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 supporto per gli 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 scrot per prendere lo schermo, tesseract per riconoscere il testo e cat per visualizzare il risultato. La versione degli appunti utilizza inoltre xsel per reindirizzare l'output negli appunti.

NOTA : scrot , xsel , imagemagick e tesseract-ocr non sono installati per impostazione predefinita ma sono disponibili dai repository predefiniti.

Potresti riuscire a sostituire scrot con gnome-screenshot , ma potrebbe richiedere molto lavoro. Riguardo all'output puoi usare tutto ciò che può leggere un file di testo (apri con Text Editor, mostra il testo riconosciuto come notifica, ecc.)

Versione della GUI dello script

Ecco una semplice versione grafica dello script OCR che include una finestra di dialogo per la 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

Oltre alle dipendenze elencate sopra dovrai installare la forcella Zenity YAD dal PPA di webupd8 per far funzionare lo script.

    
risposta data Salem 12.04.2013 - 16:59
2

Non so se qualcuno ha bisogno della mia soluzione. Eccone uno che funziona con wayland.

Mostra il riconoscimento dei caratteri in un editor di testo e se aggiungi il parametro "sì" hai ottenuto la traduzione dallo strumento trans di goggle (la connessione Internet è obbligatoria) Prima di poterlo utilizzare installa tesseract-ocr imagemagick e google -trans. Avvia lo script, ad esempio in gnome con Alt + F2 quando vedi il tuo testo che vuoi riconoscere. Sposta il courser intorno al testo. Questo è tutto. Questo script è stato testato solo per gnome. Per gli altri gestori di finestre è necessario accontentarlo. Per tradurre il testo in altre lingue, sostituire l'ID della lingua nella riga 25.

#!/bin/bash
# Dependencies: tesseract-ocr imagemagick google-trans

translate="no"
translate=

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
    
risposta data Ronald 02.05.2018 - 13:58
0

Ho appena fatto un blog su come utilizzare lo screenshot nei giorni moderni. Anche se ho preso di mira il cinese ma il cast dello schermo e il codice sono in inglese. OCR è solo una delle funzionalità.

Funzionalità per il mio OCR:

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

  • Per vimx + inglese, attiva il controllo ortografico.

  • Supporta la selezione dinamica della lingua senza hard code.

  • Finestra di dialogo di avanzamento durante la conversione e il tesseramento che è lento.

Codice funzione:

function ocr () {
    tmpj=""
    tmpocr=""
    tmpocr_p=""
    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 nello script della singola shell da eseguire.

Schermata 1:

Screenshot 2:

    
risposta data 林果皞 12.04.2016 - 11:52

Leggi altre domande sui tag