Lecture d'une chaine sur une image

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Snake22
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 26 oct. 2020 18:36
Status : Hors ligne

Lecture d'une chaine sur une image

#1

Message par Snake22 »

Bonjour,

Je parviens à générer une image à partir de l'écran grâce à la fonction "_ScreenCapture_CaptureWnd".
Cette image contient un chiffre entre 0 et 1000000.
J'aimerais connaître ce chiffre et pas juste en avoir l'image ^^

J'ai parcouru le forum, j'ai croisé l'UDF tesseract dont je ne comprend pas grand chose et sinon, je ne vois pas trop de solution. En auriez-vous une ?

Merci d'avance :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#2

Message par mikell »

Ce nombre à capturer, il s'affiche forcément dans un controle d'une fenêtre quelconque
Pourquoi ne pas directement lire le contenu de ce controle ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Snake22
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 26 oct. 2020 18:36
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#3

Message par Snake22 »

En fait non, il apparaît dans l'image que mon utilisateur m'upload et que j'affiche simplement à l'écran.
De cette image, je capture juste la partie qui comporte le chiffre qui m'est nécessaire et j'aimerais pouvoir "lire" ce chiffre en plus d'enregistrer l'image découpée.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#4

Message par mikell »

Alors oui, l'OCR est inévitable et il va falloir ou bien utiliser un programme externe ou bien utiliser Tesseract...
https://www.autoitscript.com/forum/topi ... e-example/
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Snake22
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 26 oct. 2020 18:36
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#5

Message par Snake22 »

Merci pour votre retour.

Donc si je comprends bien l'exemple démontré ici.
J'utilise "ShellExecuteWait" pour lancer tesseract.exe en lui donnant mon image découpée.
Et cela me renvoi ma chaine (dans mon cas précis mon chiffre) dans un fichier texte et/ou dans une variable.

Est-ce bien cela ?

Est-ce que tesseract peut gérer les différentes couleurs et de texte, et de fond ? (Le chiffre est écrit en "blanc" sur fond "foncé", quand l'utilisateur ne se trompe pas...)

Enfin, pouvez-vous me confirmer, s'il vous plaît, que cette version est bien la dernière en date ?
https://tesseract-ocr.github.io/tessdoc ... or-windows
Modifié en dernier par Snake22 le mar. 27 oct. 2020 16:56, modifié 1 fois.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Lecture d'une chaine sur une image  

#6

Message par walkson »

Bonjour,
Regardez ici https://github.com/UB-Mannheim/tesseract/wiki
local $TIF_FILENAME=@DesktopDir & "\BB.tif"
Local $TESS_PARAMS= $TIF_FILENAME & " output"
Local $TESS_EXE=@DesktopDir & "\tesseract.exe"
local $TWorkDir="C:\temp"
AnalyzeImage()
func AnalyzeImage()
    Local $hTimer = TimerInit() ; Begin the timer and store the handle in a variable.
    shellexecutewait($TESS_EXE, $TESS_PARAMS, $TWorkDir)
    Local $fDiff = TimerDiff($hTimer) ; Find the difference in time from the previous call of TimerInit. The variable we stored the TimerInit handlem is passed as the "handle" to TimerDiff.
    consolewrite( ($fDiff/1000) &  "seconds passed")
EndFunc
https://www.autoitscript.com/forum/topi ... nt=1389922
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Snake22
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 26 oct. 2020 18:36
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#7

Message par Snake22 »

Merci walkson, grâce à vous j'ai donc une version plus récente encore :)

Par contre votre exemple me perturbe plus qu'autre chose. Je ne comprends décidemment pas comment on utilise tesseract.
Je l'ai installé comme tout exécutable mais pour le reste, je ne percute pas... Et je ne comprends que peu l'anglais, hélas...

Je vois un format d'image "tif", pourquoi ne pas garder "bmp", comme le plus classique ? Tesseract nous l'impose ?
Pourquoi évaluer le temps d'exécution de tesseract ?
Snake22
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 26 oct. 2020 18:36
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#8

Message par Snake22 »

J'ai testé ce code qui ne présente aucune erreur mais qui ne me fourni pas du tout mon chiffre.
_ScreenCapture_CaptureWnd('test.bmp', $image, 600, 360, 660, 375, False)
 Sleep(1000)

$ImageToReadPath=@ScriptDir & "\test.bmp"
 $ResultTextPath=@ScriptDir & "\Result"
 $OutPutPath=$ResultTextPath & ".txt"
 $TesseractExePath="C:\Program Files (x86)\Tesseract-OCR\tesseract.exe"

 ShellExecuteWait($TesseractExePath, '"' & $ImageToReadPath & '" "' & $ResultTextPath & '"', "", "", @SW_HIDE)

 If @error Then
   Exit MsgBox(0, "Error", @error)
 EndIf
    MsgBox(0, "Result", FileRead($OutPutPath))

 ;FileDelete($OutPutPath)
Mon _ScreenCapture_CaptureWnd enregistre bien mon chiffre.
Mais tesseract ne me renvoi qu'une flèche vers le haut.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#9

Message par walkson »

J'ai testé avec du tif, du bmp et du jpg sans problème (si l'image est propre sinon il y a quelques erreurs)
Il y a une erreur sur votre code: il faut indiquer le chemin de l'image, un espace puis il faut mettre " output" qui s’enregistrera en txt dans le dossier indiqué dans ShellExecuteWait() troisième argument workingdir (répertoire de travail.)
J'ai testé avec une vieille version (3.2.0.0) car junkew (le lien est à la fin de mon précédent post) écrit (en anglais) :mrgreen:
Un exemple de code pour tester si le concept fonctionne toujours utilisé version 3.05.1
Pour tester, je vous conseille de vous faire un bmp avec des chiffres pour voir le résultat en suivant la méthode de junkew
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Snake22
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 26 oct. 2020 18:36
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#10

Message par Snake22 »

J'ai donc changé cette ligne:
$ImageToReadPath=@ScriptDir & "\test.bmp output"
En testant sur ce chiffre: 927,500 (avec la virgule) qui est contenu pile poil dans l'image créée plutôt dans ma capture.
Le fichier de sortie est totalement vide.
Snake22
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 26 oct. 2020 18:36
Status : Hors ligne

Re: Lecture d'une chaine sur une image

#11

Message par Snake22 »

Je viens d'utiliser la méthode que vous décrivez, celle de junkew.
Elle fonctionne ! (Presque...) :-)
Voici le code:
$tess_params="test.bmp output"
$tess_exe=@ProgramFilesDir & "\Tesseract-OCR\tesseract.exe"
$tess_workDir=""

ShellExecuteWait($tess_exe, $tess_params, $tess_workDir)
J'ai vraiment fait au plus simple (avec la déclaration des variables faites avant bien sûr).
Dans mon fichier txt "output", je retrouve bien mon chiffre 927,500. (Avec la virgule :) )
Mais à la ligne suivante, j'ai un symbole de flèche , que veut-il dire ?

EDIT: Grâce à regex, je ne garde que la partie chiffrée qui m'est nécessaire, donc ça fonctionne , merci =)
Répondre