web-dev-qa-db-fra.com

Comment extraire instantanément du texte d'une zone d'écran à l'aide des outils de ROC?

Dans Ubuntu 12.10, si je tape

gnome-screenshot -a | tesseract output

il retourne:

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

Comment puis-je sélectionner un texte à l'écran et le convertir en texte (presse-papiers ou document)?

Je vous remercie!

26
Erling

Peut-être existe-t-il déjà un outil qui fait cela, mais vous pouvez également créer un script simple avec un outil de capture d'écran et un tesseract, comme vous essayez de les utiliser.

Prenons comme exemple ce script (dans mon système, je l’ai sauvegardé sous le nom /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

Et avec le support du presse-papier:

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

Il utilise scrotpour afficher l'écran, tesseractpour reconnaître le texte et catpour afficher le résultat. La version du presse-papier utilise en outre xselpour diriger la sortie dans le presse-papier.

sample usage

NOTE: scrotname__, xselname__, imagemagicket tesseract-ocr ne sont pas installés par défaut, mais sont disponibles à partir des référentiels par défaut.

Vous pourrez peut-être remplacer scrotpar gnome-screenshot, mais cela peut prendre beaucoup de travail. En ce qui concerne la sortie, vous pouvez utiliser tout ce qui peut lire un fichier texte (ouvert avec l'éditeur de texte, afficher le texte reconnu comme une notification, etc.).


Version graphique du script

Voici une version graphique simple du script OCR incluant une boîte de dialogue de sélection de la langue:

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

Outre les dépendances répertoriées ci-dessus, vous devrez installer Zenity fork YAD à partir du PPA webupd8 pour que le script fonctionne.

35
Salem

Je ne sais pas si quelqu'un a besoin de ma solution. En voici un qui fonctionne avec wayland.

Il montre la reconnaissance des caractères dans un éditeur de texte et, si vous ajoutez le paramètre "oui", vous obtenez la traduction de l'outil de conversion de lunettes (la connexion Internet est obligatoire). Avant de pouvoir l'utiliser, installez tesseract-ocr imagemagick et google-trans. Démarrez le script dans gnome avec Alt + F2 lorsque vous voyez le texte que vous souhaitez reconnaître. Déplacez le courser autour du texte. C'est tout. Ce script a été testé uniquement pour gnome. Pour les autres gestionnaires de fenêtres, il faut en tenir compte. Pour traduire le texte dans d'autres langues, remplacez l'ID de langue de la ligne 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
3
Ronald

Je viens de faire un blogging sur l'utilisation de la capture d'écran de nos jours. Même si je cible le chinois, la distribution de l'écran et le code sont en anglais. L'OCR est simplement l'une des fonctionnalités.

Fonctionnalité pour mon OCR:

  • Ouvrir dans konsole + vimx OR gedit pour éditer davantage.

  • Pour vimx + english, activez la vérification orthographique.

  • Soutenir la sélection de langue dynamique sans code dur.

  • Boîte de dialogue de progression lors de la conversion et du tesseracting, ce qui est lent.

Code de fonction:

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

Code de l'appelant:

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 &

Combinez ce code 2 dans un seul script Shell à exécuter.

Capture d'écran 1: enter image description here

Capture d'écran 2: enter image description here

1
林果皞

L’idée est qu’à chaque fois qu’un nouveau fichier de capture d’écran apparaît dans le dossier d’exécution du tesseract OCR et s’ouvre dans un éditeur de fichier.

Vous pouvez laisser ce script en cours d'exécution dans le répertoire de sortie de votre répertoire de sortie de capture d'écran préféré.

#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

Vous aurez besoin de cela pour être appelé

Sudo apt install tesseract-ocr
Sudo apt install inotify-tools
0
Eduard Florinescu

J'ai créé un programme libre et open source à cette fin:

https://danpla.github.io/dpscreenocr/

enter image description here

0
danpla