[R] Reconnaissance d'image

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

[R] Reconnaissance d'image

#1

Message par Jerome »

Bonjour,

J'aurai aimé travailler sur un script mais je ne sait pas si ce que je voudrais est possible.

Je m'explique, je voudrait faire un script qui permet de, si il y a dans un range spécial de mon écran (admettons x(400;500) et y(300;400) => on obtient un rectangle) une certaine image ce trouve (que ce soit n'importe ou dans ce range), il exécute en conséquence une action.

Donc je partirais plus dans un script qui me permettrait de reconnaitre une image sur mon écran, sans cependant savoir si c'est possible.

En conséquence je vous demande déjà ce que je voudrais faire possible, puis apres, peut - être un début de programe et savoir quel include il faut utiliser.

PS : L'image à trouver sur mon écran est préalablement enregistré quelque part sur mon ordinateur en format .jpg ou autre.

Merci de votre aide et bonne journé.
Modifié en dernier par Jerome le jeu. 14 mai 2009 09:04, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] reconnaissance d'image

#2

Message par Tlem »

Ceci devrait répondre à votre attente : http://www.autoitscript.fr/forum/viewto ... f=6&t=2901

Un exemple est fournit dans le fichier.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] reconnaissance d'image

#3

Message par Jerome »

Re-bonjour,

J'ai pas tous compris dans le fichier que vous me donnez.

Pour le moment, j'ai fait sa :

Code : Tout sélectionner

#include <ImageSearch.au3>

$x1=0
$y1=0


$result = _ImageSearch("test.jpg",0,$x1,$y1,0)
if $result=1 Then
    MsgBox(0,"Trouvé","L'image a été trouvé")
EndIf

if $result=0 Then

EndIf
Donc par contre ce que je ne vous ai pas précisez, c'est que je voudrais que le script soit tous le temps actif et que lorsqu'il voit l'image à l'écran, il exécute ce que je lui dit (donc pour moi mettre une boucle While1 => Wend, mais ou ??).

Cependant je ne sait pas quoi dire au script si justement l'image que je recherche n'est pas présente au moment "t", puisque le script me ressort l'erreur suivante, qui pour moi veut dire que si il n'y a rien, le script fait quoi ?

Code : Tout sélectionner

C:\Program Files\AutoIt3\Include\ImageSearch.au3 (40) : ==> Subscript used with non-Array variable.:
if $result[0]="0" then return 0
if $result^ ERROR
>Exit code: 1    Time: 0.313
Merci de votre aide.

Sinon PS : L'image que je veux recherche que j'ai en format ".jpg", je doit la stocker ou ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] reconnaissance d'image

#4

Message par Tlem »

Je dirais que votre erreur vient sûrement du fait que vous n'avez pas copié la DLL dans le chemin de votre script (un petit oubli dans le codage de l'UDF ;) ).

Pour le reste de votre demande, comme je ne connais pas votre script principal, il m'est difficile de vous répondre avec exactitude, mais je vous conseillerais d'utiliser plutôt la fonction AdlibEnable qui lancera la fonction de test à intervalle régulier (toutes les 5 secondes par exemple) en prenant soin de renvoyer dans une variable, la valeur du test : 1 l'image est présente - 0 l'image n'est pas présente.
Après, dans votre script principale, à vous d'effectuer le traitement qui s'impose. :roll:

PS : Dans votre demande initiale vous parliez de tester une zone d'écran.
Cela est possible avec cet UDF et la fonction _ImageSearchArea.
Ouvrez le fichier ImageSearch.au3 pour plus de détails sur les paramètres de la fonction.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] reconnaissance d'image

#5

Message par Jerome »

""Je dirais que votre erreur vient sûrement du fait que vous n'avez pas copié la DLL dans le chemin de votre script (un petit oubli dans le codage de l'UDF ;) ).""

J'ai pas tous compris, j'ai bien extrait le fichier ImageSearch.au3 dans le dossier include, si il y autre chose a extraire (DLL ??), que faut t'il extraire et ou ? (pardonner ma débilité)

Sinon tout le range de l'écran est aussi bon pour mon cas.

Je n'est pas de script principal, mon seul et unique but est de détecter la présence d'un image le plus rapidement possible et d'exécuter une action si l'événement booléen est "VRAI", et sinon ne rien faire si "FAUX".

Merci de votre aide.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] reconnaissance d'image

#6

Message par Tlem »

Dans le fichier ImageSearch.zip, vous avez le fichier ImageSearchDLL.dll.
Ce fichier doit être placé dans le même répertoire que votre script ainsi que vos images à détecter (Vous pouvez aussi placer la DLL dans le dossier Windows).
C'est cette DLL qui permet la reconnaissance de l'image, sans elle ... :cry:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Reconnaissance d'image

#7

Message par Jerome »

Bonjour,

Alors placé la DLL ou il fallait, mon script s'exécute, mais il ne reconnait pas l'image ou n'exécute pas l'action que je lui demande lorsque cette image apparait.

Mon script que j'ai modifier depuis :

Code : Tout sélectionner

#include <ImageSearch.au3>

$x1=0
$y1=0

While 1

     $result = _ImageSearch("test.jpg",0,$x1,$y1,0)
     if $result=1 Then
          MsgBox(0,"Trouvé","L'image a été trouvé")
     EndIf

Wend
Donc la boucle pour que le script tourne tout le temps, mais il ne marche pas.

Ce que j'ai fait : Image + script + DLL mise dans un même fichier dans un de mes disques local, copié aussi la DLL dans C/windows/system32


Une idée de pourquoi sa ne fonctionne pas ?

PS : Après quelques tests, le script ne parvient pas a reconnaitre l'image que je lui demande de me reconnaitre, il y a un format spécial à cette image ou faut-il faire autre chose dans le script ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Reconnaissance d'image

#8

Message par Tlem »

Une image Jpeg est une image compressée, donc les informations disponibles dans l'image ne sont sans doute pas les même que celles affichées à l'écran (profondeur des couleurs par exemple).
Capturez et sauvegardez l'image à rechercher au format BMP 24 bits.
D'après ce que je viens de tester, cela devrait aller beaucoup mieux.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Reconnaissance d'image

#9

Message par Jerome »

Effectivement sa marche nickel,

Dernière petite question, comment syntaxiquement je peut dire pour plusieurs images maintenant.

Pour que sa soit toujours dans la boucle, je recréer toujours un $result ??

PS : Esque si je renseigne une zone (range) sur l'écran, la macro sera plus rapide que si je balaye tout l'écran ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Reconnaissance d'image

#10

Message par Tlem »

Jerome a écrit :comment syntaxiquement je peut dire pour plusieurs images maintenant.
Combien d'images ?
Jerome a écrit :Esque si je renseigne une zone (range) sur l'écran, la macro sera plus rapide que si je balaye tout l'écran ?
Bonne question.
Il faut faire des tests, mais je dirais que oui car la zone de recherche étant moindre, le traitement devrait être plus rapide.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Reconnaissance d'image

#11

Message par Jerome »

Tlem a écrit :
Jerome a écrit :comment syntaxiquement je peut dire pour plusieurs images maintenant.
Combien d'images ?
Autant que je veux, mais sachant que sa sera une par une (et pas plusieurs a la fois).

Sinon pour le range de la fonction, par rapport au coordonné x et y sa se note comment ?

Es que mon $x1 et mon $y1 sont a modifier ?

Sachant que dans l'exemple ils mettent :

Code : Tout sélectionner

$result = _ImageSearchArea("recycle.bmp",1,0,0,200,200,$x1,$y1,0)
A quoi correspond le premier 200 (x ou y, horizontal ou vertical ?) et le second ?

Puisque pour moi, pour faire un rectangle en range, il faut 2 coordonnées X et deux Y.

Merci de ton aide
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Reconnaissance d'image

#12

Message par Tlem »

Pour plusieurs images, il vous faudra fatalement utiliser une boucle.
Vous pourriez par exemple stocker les fichiers images à reconnaitre dans un répertoire spécifique, puis lister ces fichiers dans un tableau, et enfin faire une fonction qui cherche ces images une à une à l'aide d'une boucle de lecture du tableau.

Pour savoir comment utiliser les paramètres de la fonction _ImageSearchArea , je vous conseil d'éditer le fichier ImageSearch.au3 et de lire les lignes commentaires qui explique tout (ou presque).
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Reconnaissance d'image

#13

Message par Jerome »

Hum,

Code : Tout sélectionner

Func _ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance)
La dedans je ne comprend c'est quoi $x1, $y1, $right, $bottom, ByRef $x et ByRef $y.

Peux-tu m'eclairer et si possible me donner un exemple avec des coordonnées de 400 en x, 100 en y et un rectangle de 500*500 ?

Merci a toi
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Reconnaissance d'image

#14

Message par Tlem »

Disons, qu'il faut regarder les deux fonctions côte à côte :

Code : Tout sélectionner

_ImageSearchArea($findImage,$resultPosition,0,0,@DesktopWidth,@DesktopHeight,$x,$y,$tolerance)

_ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance)
et là, on arrive à deviner ou mettre les valeurs.
$X1 et $y1 représentes respectivement les coordonnées X et Y en haut à droite du rectangle, $right et $bottom représentes respectivement les coordonnées X et Y en bas à droite du rectangle.

Soit :

Code : Tout sélectionner

$x1=0
$y1=0
_ImageSearchArea("test.jpg", 1, 400, 100, 500, 500, $x1, $y1, 0)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Reconnaissance d'image

#15

Message par Jerome »

Effectivement, au debut sa ne fonctionnait pas car mon range était de 50*50, et qu'il ne me le prend pas (va savoir pourquoi ??).

J'ai modifier par un range de 500 *500 et sa marche.

Y'a t'il moyen de réduire le range a 50 * 50 ?

Sinon tu as marqué : "$X1 et $y1 représentes respectivement les coordonnées X et Y en haut à droite du rectangle, $right et $bottom représentes respectivement les coordonnées X et Y en bas à droite du rectangle."

C'est pas plutôt : $X1 et $y1 représentes respectivement les coordonnées X et Y en haut à gauche du rectangle, $right et $bottom représentes respectivement les coordonnées X et Y en bas à droite du rectangle.

Edit : En faite pas mis de range, mais plutôt les coordonnées en bas à droite du rectangle.

Sujet résolu, merci a toi Tlem.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Reconnaissance d'image

#16

Message par Tlem »

Oui c'est bien ça, je voulais dire en haut à gauche.

... Je suis vraiment fatigué en ce moment .... :cry:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
wouchen
Niveau 1
Niveau 1
Messages : 4
Enregistré le : sam. 02 mai 2009 12:46
Status : Hors ligne

Re: [R] Reconnaissance d'image

#17

Message par wouchen »

bonjour,
Merci déjà pour tout Tlem.
J'aimerais savoir si on peut mettre une condition "générale" sur une détection d'image ?

Je m'explique : je souhaiterai que mon script fasse une boucle de "mouseclick" et que, à tout moment, si une image apparait met en pause la boucle, clic sur l'image,fait quelques petits clic jusqu'à ce que une autre image apparaisse ensuite il continue la boucle de "mouseclick".
► Afficher le texte
Voila ce que j'ai, mais la condition ne s'effectue que après le dernier mouseclick de la boucle.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Reconnaissance d'image

#18

Message par Tlem »

Oui, c'est possible, mais la détection des images prend un certain temps, donc plus vous aurez d'images à détecter et plus la fonction de détection des images prendra du temps.

Sinon, il vous suffit de faire votre boucle de MouseClick, de rajouter dans le code (avant la boucle) un AdlibEnable qui lancera la détection des images à intervalle régulier (attention au temps d'exécution), puis dans cette fonction ce que vous devez faire si une image est trouvée.
Une fois cette fonction exécutée, le script continuera la boucle MouseClick jusqu'au prochain lancement du AdlibEnable.

Cela dit sans plus de précision il va être difficile d'aller plus loin. Le problème, c'est que si vous donnez plus d'explications, j'ai bien peur que la fonctionnalité de votre script ne me plaise pas trop. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
wouchen
Niveau 1
Niveau 1
Messages : 4
Enregistré le : sam. 02 mai 2009 12:46
Status : Hors ligne

Re: [R] Reconnaissance d'image

#19

Message par wouchen »

Ne vous inquiétez pas c'est juste pour automatiser une tache ( antivirus affiche une image souvent et demande de faire clic par ci par la ) .Voila Et merci problème résolut.
Mais vous pourriez m'expliquer un peu plus pour faire avec 2 image .Vous avez parlé de tableau j'ai pas trop compris :D .(je débute dans auto it)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Reconnaissance d'image

#20

Message par Tlem »

L'histoire du tableau, c'est juste pour stocker le nom des fichiers image.
C'est à dire qu'on utilise une fonction qui lit un dossier à la recherche de fichiers spécifiés, puis stocke leur nom et chemin dans une variable tableau.
Ensuite dans le code, il suffit de lire cette variable à l'aide d'une boucle pour prendre les noms des fichiers un à un pour faire le traitement. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre