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

27

Dans Ubuntu 12.10, si je tape

gnome-screenshot -a | tesseract output

il renvoie:

** 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)?

Merci!

Erling
la source
Vous obtenez cette erreur en utilisant uniquement gnome-screenshot -a? Aussi pourquoi vous dirigez la sortie vers tesseract? Si je ne me trompe pas, gnome-screenshot enregistre l'image dans un fichier et ne "l'imprime" pas ...
Salem
L'avertissement devrait être inoffensif si je regarde à travers bugzilla. Question: quel est le auto-save-directory? Et cela a-t-il laissé quelque chose là-dedans? Lien intéressant: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind
gnome-screenchot -a -c est censé copier la sélection dans le presse-papiers, n'est-ce pas ?. mais le canaliser pour tesseract donne la même erreur. le répertoire par défaut est home / pictures (fonctionne bien).
Erling
1
Je viens de le faire en utilisant gnome-screenshot - j'ai ensuite dû éditer les fichiers pour réduire la profondeur de couleur de 16m à 2 (c'était du texte noir sur fond blanc, mais avec le lissage de polices fantaisie d'aujourd'hui et ainsi de suite, ce n'était pas vraiment noir ) J'ai ensuite dû redimensionner l'image jusqu'à 200% de l'original avant d'obtenir un OCR précis de tesseract - mais cela a très bien fonctionné une fois que j'ai fait cela.
@SteveLake Hey Steve, merci pour la suggestion. J'ai édité le script pour modifier l'image par programme de la manière que vous avez décrite avant de l'OCR. Le taux de détection devrait maintenant être bien meilleur.
Glutanimate

Réponses:

35

Peut-être qu'il existe 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 l'utiliser.

Prenons comme exemple ce script (dans mon système, je l'ai enregistré sous /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-papiers:

#!/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 permet scrotde prendre l'écran, tesseractde reconnaître le texte et catd'afficher le résultat. La version presse-papiers utilise également xselpour diriger la sortie dans le presse-papiers.

exemple d'utilisation

REMARQUE : scrot, xsel, imagemagicket tesseract-ocrne sont pas installés par défaut , mais sont disponibles à partir des référentiels par défaut.

Vous pourrez peut-être le 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 (ouvrez-le avec l'éditeur de texte, affichez le texte reconnu comme une notification, etc.).


Version GUI du script

Voici une version graphique simple du script OCR comprenant 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

Mis à part les dépendances répertoriées ci-dessus, vous devrez installer le fork Zenity YAD à partir du webupd8 PPA pour faire fonctionner le script.

Salem
la source
fonctionne bien dans le terminal! Je vous remercie! Je veux screencopy codetext des tutoriels pour les tests. Comment utiliser Scrot dans le presse-papiers?
Erling
1
que se passe-t-il avec les fichiers temporaires?
Erling
1
Les fichiers temporaires y restent jusqu'à ce que vous redémarriez votre ordinateur. Si cela vous pose problème, vous pouvez simplement les supprimer à la fin ( rm $SCR_IMG.png $SCR_IMG.txt).
Salem
1
scrotpar lui-même ne peut pas utiliser le presse-papiers. Mais il existe des outils comme xclipou xselqui peuvent faire ce dont vous avez besoin pour copier / coller du texte.
Salem
1
Ajout à la réponse de Salem: Si vous exécutez KDE, vous pouvez appeler un autre script pour envoyer automatiquement le texte que vous avez généré au presse-papiers, prêt à coller. Vous trouverez un script approprié ici . Suivez les instructions de cette page pour installer ce script. Il vous suffit ensuite d'ajouter | clipboardà la fin de la dernière ligne du script de Salem.
Chris
3

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 protection des lunettes (la connexion Internet est obligatoire) Avant de pouvoir l'utiliser, installez tesseract-ocr imagemagick et google-trans. Démarrez le script, c'est-à-dire dans gnome avec Alt + F2 lorsque vous voyez votre texte que vous souhaitez reconnaître. Déplacez le coursier autour du texte. C'est ça. Ce script a été testé uniquement pour gnome. Pour les autres gestionnaires de fenêtres, il doit être adapté. Pour traduire le texte dans d'autres langues, remplacez l'ID de langue à 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
Ronald
la source
1

Je viens de faire un blog sur la façon d'utiliser la capture d'écran de nos jours. Même si je cible le chinois, la diffusion d'écran et le code sont en anglais. L'OCR n'est qu'une des fonctionnalités.

Fonctionnalité pour mon OCR:

  • Ouvrez dans konsole + vimx OU gedit pour poursuivre la modification.

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

  • Prend en charge la sélection de langue dynamique sans code dur.

  • Boîte de dialogue de progression lors de la conversion et de la tesseraction, 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 script shell unique pour exécuter.

Capture d'écran 1: entrez la description de l'image ici

Capture d'écran 2: entrez la description de l'image ici

林果 皞
la source
semble être une solution décente mais la lisibilité de votre script est très mauvaise
ukos
0

L'idée est à chaque fois qu'un nouveau fichier de capture d'écran apparaît dans le dossier exécutez tesseract OCR et ouvrez-le dans un éditeur de fichiers.

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 en aurez besoin pour être installé

sudo apt install tesseract-ocr
sudo apt install inotify-tools
Eduard Florinescu
la source