[UDF] FastFind - Recherches avancées de pixels à l'écran

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
FastFrench
Niveau 1
Niveau 1
Messages : 13
Enregistré le : mar. 25 janv. 2011 11:57
Status : Hors ligne

[UDF] FastFind - Recherches avancées de pixels à l'écran

#1

Message par FastFrench »

Comme j'étais trop limité par ce qui était faisable avec PixelSearch, j'ai écrit une DLL optimisée en C++ pour faire des recherches à l'écran.

La fonction la plus simple permet de trouver le pixel d'une couleur donnée - comme PixelSearch - mais au lieu de renvoyer le 1er trouvé, il retourne le plus proche d'un point donné.

Ca permet d'aller bien plus loin :
- recherche du 'spot' le plus proche (carré de NxN contenant au moins P pixels respectant les critères de couleur mentionnés)
- gère une liste contenant jusqu'à 1024 couleurs (recherche les pixels ayant l'une des couleurs dans cette liste)
- gère jusqu'à 1024 rectangles d'exclusion. On peut ainsi définir très précisément la zone de recherche que l'on veut (avec un rectangle global auquel se substituent tous les rectangles d'exclusion).
- possibilité d'avoir un 'shade variation' (même principe qu'avec PixelSearch, pris en compte sur chacune des couleurs).
- permet de travailler sur plusieurs 'SnapShots' (captures) en mémoire. Il est possible de conserver jusqu'à 1024 captures simultanément (bien entendu, chaque capture consomme de la mémoire, aussi n'utilisez que les "slots" dont vous avez besoin).
- fonctionne sur tout l'écran ou en précisant un handle de fenêtre.
- inclut également des fonctions pour identifier ce qui change entre deux SnapShots (rectangle minimum contenant tous les changements + nombre de pixels différents). Pratique pour détecter les mouvements à l'écran, les objets qui changent d'état...
- un système de traces assez sophistiqué est inclus dans cet UDF. Vous pouvez choisir le type de traces que vous voulez, avec notamment la possibilité de visualiser à l'écran les zones détectées (pratique en cours de développement) et enregistrer le détail des opérations dans un fichier de traces.
- pour encore plus de performance, vous pouvez capturer le contenu d'un écran en mémoire (SnapShot, prend environ le même temps qu'un PixelSearch ou un PixelGetColor) puis effectuer toutes les recherches que vous voulez dans cette capture (fonctions très rapides).

Sont inclus dans l'archive la dll (écrite en Visual C++ 2010), le Wrapper AutoIt, et une démonstration.

Voici le détail des fonctions exposées dans la dll :
► Afficher le texte.h
► Afficher le texteFonctions Autoit définies dans cet UDF FastFind.au3
► Afficher le texteDémonstration AutoIt
Voilà, vos remarques et suggestions sont les bienvenues.

J'espère que ces fonctions vous seront utiles.

FF

[update] il y a maintenant les version 32 et 64 bits de la dll

Edit (Tlem) : Pour les nouvelles versions merci de suivre ce lien vers le site US : https://www.autoitscript.com/forum/topi ... h-library/
Vous y trouverez des exemples, commentaires et sondages concernant cet UDF.



.
Fichiers joints
FastFind1_3.zip
(Update) New version 1.3
-> no French left : all comments are now in english (error messages and traces in the dll were allready in english)
-> Several function calls are now more simple : Now the x1,y1,x2,y2 limits of the area for search functions are optional. Default values means full window (or screen))
** Warning ** I've changed the order of the parameters in some fonctions, to make them easier to use. So if you use any of the 3 following function, you will need
to reorder the parameters if you want to update to the version 1.3 of FastFind.
-> Some minor bug fixed
Func FFNearestPixel($PosX, $PosY, $Color, $ForceNewSnap=true, $Left=0, $Top=0, $Right=0, $Bottom=0, $NoSnapShot=$FFLastSnap, $WindowHandle=-1)
Func FFNearestSpot($SizeSearch, $NbPixel, $PosX, $PosY, $Color, $ShadeVariation=0, $ForceNewSnap=true, $Left=0, $Top=0, $Right=0, $Bottom=0, $NoSnapShot=$FFLastSnap, $WindowHandle=-1)
Func FFColorCount($ColorToCount, $ShadeVariation=0, $ForceNewSnap=true, $Left=0, $Top=0, $Right=0, $Bottom=0, $NoSnapShot=$FFLastSnap, $WindowHandle=-1)
(126.35 Kio) Téléchargé 1335 fois
FastFind1_2.zip
[Update Version 1.2] Ajout fonctions suivantes dans wrapper : FFGetPixel, FFGetVersion et FFGetLastError. Ainsi qu'un petit script de Benchmark. La version 1.2 est fournie avec une dll 32bits et une 64 bits, la bonne est automatiquement sélectionnée.
(126.16 Kio) Téléchargé 960 fois
FastFind1_1.zip
(63.41 Kio) Téléchargé 919 fois
Modifié en dernier par FastFrench le sam. 12 mars 2011 22:16, modifié 3 fois.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF]FastFind - Recherches avancées de pixels à l'écran

#2

Message par matwachich »

Waw!
En effet ça a l'aire génial ce truc!
Est-que tu as fait des benchmark, comparant les fonctions natives de autoit et les tiennes?
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
cutprod
Niveau 6
Niveau 6
Messages : 273
Enregistré le : jeu. 30 sept. 2010 17:25
Localisation : Sud Ouest
Status : Hors ligne

Re: [UDF]FastFind - Recherches avancées de pixels à l'écran

#3

Message par cutprod »

Aie! Aie! Aie!!
Ça a l'aire au top!!
Il y'a quelque temps j'ai chercher partout un UDF comme celui ci pour activer une tourelle de servo-moteur en fonction des mouvements détecter par une webcam.
Devant le manque de ressource j'ai fini par asservir un autre petit log de "motion tracking" avec Autoit ce qui ma donné des résultats satisfaisant...
Mais la ton boulot a l'aire bien puissant!!
Félicitations.
Modifié en dernier par cutprod le jeu. 10 mars 2011 22:37, modifié 1 fois.
Cut, srcipteur du dimanche...désolé !-)
FastFrench
Niveau 1
Niveau 1
Messages : 13
Enregistré le : mar. 25 janv. 2011 11:57
Status : Hors ligne

Re: [UDF]FastFind - Recherches avancées de pixels à l'écran

#4

Message par FastFrench »

(à propos des benchmarks)
Oui et non. En fait, il n'y a qu'une seule fonction qui est très proche fonctionnellement... c'est GetPixel (équivalent de l'instruction native PixelGetColor).
► Afficher le texteremarque
La comparaison de GetPixel (FastFind) et de PixelGetColor est intéressante car elle illustre bien l'un des intérêts des fonctions présentes dans FastFind: en faisant des benchmarks sur les fonctions natives d'AutoIt, on constate que PixelGetColor et PixelSearch prennent sensiblement le même temps pour s'executer (environ 20ms). Pourtant, on pourrait penser que PixelGetColor n'a besoin que de lire le contenu mémoire de la RAM vidéo pour 1 pixel (4 octets), alors que PixelSearch doit analyser toute la zone de recherche ce qui semblerait logiquement bien plus long.
Cela s'explique par les fonctions GDI utilisées. Il s'avère que ce qui est long, c'est l'ensemble des instruction GDI qui permettent de copier la mémoire vidéo en mémoire vive, et on constate que si la quantité de mémoire (la taille de la zone) a une influence, celle-ci reste assez limitée. Même pour 1 seul pixel, il faut plus de 15 ms. Précisément, c'est la fonction BitBlt du GDI qui prend le plus de temps.

Ce constat m'a amené à scinder les deux étapes : copier les données vidéo en mémoire (FFSnapShot) et effectuer des recherches sur cette mémoire.
Ainsi, si on lance ce petit benchmark:
► Afficher le texteBenchmark PixelGetColor
On constate que la variante utilisant FastFind, en ne faisant qu'une seule capture pour ensuite regarder la couleur de 500 pixels, va 108 fois plus vite !

Pour la fonction la plus simple (FFNearestPixel, permettant de retrouver le pixel le plus proche ayant une couleur donnée), on pourrait écrire un algorithme Optimisé en Autoit natif (utilisant la dichotomie) qui ne serait que 10 à 15 fois plus lent que la version FastFind (environ 200 à 500ms pour obtenir le résultat).

Mais pour les autres fonctions, fonctionnant sur des zones, avec une liste de couleurs, elles seraient inutilisables tellement elles seraient lentes en AutoIt : on arriverait rapidement à des minutes voir des heures de traitement pour faire l'équivalent. Idem pour la fonction qui permet de détecter tous les changements intervenant sur un écran. Ce serait très lent et compliqué de le faire en Autoit.

On pourrait aussi être tenté de passer par des DllCall pour accéder à l'API Windows, et reproduire sur le principe ce que j'ai implémenté dans la DLL. Mais là encore, j'ai constaté que sur les traitements purs, un traitement est effectué environ 1000 fois plus rapidement en C++ (compilateur optimisé) qu'en Autoit (langage interprété). (cf http://www.autoit.fr/forum/viewtopic.php?f=9&t=7050)

Sur mes essais avec les fonctions de FastFind, j'ai rarement dépassé 100ms pour des recherches assez compliquées réalistes. Mais on doit pouvoir atteindre des temps plus importants si on s'amuse à faire des opérations comme:
rechercher une grande zone (500x500 par exemple) sur un écran de grande résolution (1920x1200 par exemple), avec 1024 couleurs actives dans la liste, 1024 rectangles d'exclusion, et un "ShadeVariation"...

Mais même ainsi, je ne pense pas que l'on atteigne la seconde.
FastFrench
Niveau 1
Niveau 1
Messages : 13
Enregistré le : mar. 25 janv. 2011 11:57
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#5

Message par FastFrench »

[Update Version 1.2]
Ajout des fonctions suivantes dans l'UDF : FFGetPixel, FFGetVersion et FFGetLastError. Ainsi qu'un petit script de Benchmark.
Cette version 1.2 est désormais fournie avec une dll 32bits et une autre 64 bits, la bonne est automatiquement sélectionnée au démarrage.
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#6

Message par timmalos »

Si je peux vous donner un conseil, c'est de partager votre travail sur le forum anglais autoitscript.com, vous aurez des retours plus interessants que vous pourriez en avoir ici.

Une fois fait, n'hesitez pas à nous donner le lien ici pour qu'on puisse suivre ce qui s'y dit ;)
FastFrench
Niveau 1
Niveau 1
Messages : 13
Enregistré le : mar. 25 janv. 2011 11:57
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#7

Message par FastFrench »

Syric
Niveau 1
Niveau 1
Messages : 1
Enregistré le : ven. 24 déc. 2010 00:23
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#8

Message par Syric »

Je voulais te demander si c'était possible de désactiver le TRACER.TXT et le petit bybye à la fin :D
FastFrench
Niveau 1
Niveau 1
Messages : 13
Enregistré le : mar. 25 janv. 2011 11:57
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#9

Message par FastFrench »

Syric a écrit :Je voulais te demander si c'était possible de désactiver le TRACER.TXT et le petit bybye à la fin :D
Pour ne plus générer de fichier de Trace (TRACER.TXT), le plus simple est de changer le mode de debug par défaut au tout début de FastFind.au3 :
global $FFDefautDebugMode = 0x00 (par défaut, c'est 0x27 actuellement).

tu devrais aussi essayer avec :
global $FFDefautDebugMode = 0x04 ; (affiche le résultat des recherches graphiquement).

Tu peux aussi appeller FFSetDebugMode(0) juste après l'include de Fastfind.au3.

Si tu veux tout de même conserver les avertissements en cas d'erreurs graves, garde certaines traces actives (comme avec 0x31 par exemple).

Pour le petit "bybye" qui s'affiche au déchargement de la dll, c'était pour m'assurer que la dll se décharge correctement. Je virerai ce message dans la prochaine version (mais bon, ça reste assez discret).
FastFrench
Niveau 1
Niveau 1
Messages : 13
Enregistré le : mar. 25 janv. 2011 11:57
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#10

Message par FastFrench »

Nouvelle version 1.3
http://www.autoitscript.com/forum/topic ... id__877709

Un benchmark plus complet :
  • Native GetPixelColor: 19ms
    Native PixelSearch (FullScreen 1020x1080 and ShadeVariation): 88ms
    FFGetPixel: 0.027 ms (27 µs)
    SnapShot small area (10x10): 18ms
    SnapShot FullScreen (1920x1080): 65ms
    Simple pixel search in medium size (200x200) area: 0.17 ms (170µs)
    Pixel search in FullScreen (1920x1080) and ShadeVariation: 68ms (FF function do not return the first Pixel, but the closest to a given point)
    Complexe FullScreen Search (1920x1080 area, searching for a 20x20 spot having 50 pixels within a list à 5 colors with a ShadeVariation of 10, and 3 excluding rectangles): 78 ms
Avatar du membre
karime1
Niveau 5
Niveau 5
Messages : 106
Enregistré le : sam. 09 avr. 2011 10:05
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#11

Message par karime1 »

bonjours,
je cherche une fonction comme pixelsheach mais qui cherche pas un pixel dans cet ordre
(defo)
1 2 3
4 5 6
mais plutot une qui commence par le bas
4 5 6
1 2 3
ou
1 3 5
2 4 6
ou
6 5 4
3 2 1

vous avez compris ce que je ve dire :D
ce serai bien si vous arrivez a faire cette fonction
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11772
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#12

Message par Tlem »

Il est parfois utile de lire correctement la documentation ...
PixelSearch :

Remarks
The search direction varies as follows:
Left-to-Right - left < right
Right-to-Left - right < left
Top-to-Bottom - top < bottom
Bottom-to-Top - bottom < top

Changing the search direction can be a useful optimization if the color being searched for frequently appears in in a specific quandrat of the search area since less searching is done if the search starts in the most common quadrant.
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é".
IsLaMalice
Niveau 4
Niveau 4
Messages : 50
Enregistré le : lun. 03 avr. 2017 23:31
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#13

Message par IsLaMalice »

Bonjour,

je suis estomaqué de voir qu'on ne commente pas ce boulot, que tu nous a parlé de la nouvelle version 1.3,
et qu'a l'inverse, 18 pages sur le site US, avec la description de la version 2.2 !
- [v1.4] : find the "best spot" - meaning the spot that has the best number of "right" colors.
- [v1.4] : now provided with a tool, FFShowPixels.exe, to find colors, manage color lists, show all occurences of them on the Captured Window, and... automatically generates AutoIt or C++ code.
- [v1.6] : Saves SnapShots on BitMaps (BMP and JPG supported)
- [v1.6] : Modifies SnapShots with "filters" (Keep only some colors or only pixels that have changes. All other pixels can be turned to black).
- [v1.7] : Can change pixels colors on SnapShots (SetPixel)
- [v1.7] : Can access the Raw pixel data of SnapShots (GetRawData)
- [v1.7] : Can draw back SnapShots on Screen.
- [v1.8] : Bug fixes. Deleted
- [v1.8.1] : Bug fixes (FastFind.au3).
- [v1.8.2] : Bug fixes (FastFind.au3).
- [v1.8.3] : Bug fixes (FastFind.au3). Deleted
- [v1.8.4] : Should now run on early XP and Windows 2000 OS.
- [v2.0] : Documentation file in english (FastFind.chm), several new functions and new feature on some old functions.
- [v2.1] : Bug fixes (removed those nasty errors in message boxes)
- [v2.2] : Bug fix
Included in the archive: both the 32 bits and 64 bits dll (written in Visual C++ 2010), the AutoIt Wrapper, a demonstration script and a tiny Benchmark script.
te voila bientot dans la silicon valley, bye la france ?
et si cet UDF permet de faire des trucs insensés, n'aurions nous pas pu la garder entre franchouillards, pour nos french startup ?

Is
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#14

Message par jchd »

Ca signifie seulement qu'il y a au moins 18 fois plus d'anglophones que de francophones qui trichent à des jeux vidéo.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
IsLaMalice
Niveau 4
Niveau 4
Messages : 50
Enregistré le : lun. 03 avr. 2017 23:31
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#15

Message par IsLaMalice »

Bonsoir,
Fastfrench, si tu es encore la, ou n'importe qui qui peut me renseigner :


est ce que cet UDF permet de vérifier si un petite zone est identique ou a changé ?


Je m'exprime : normalement, s'affiche "Rien" à un endroit précis, mais je n'ai pas de ControlGetText ($Handle,"","Edit1") possible (ce n'est pas un logiciel avec des Edit windows)

Si je fait une opération de recherche, soit bingo, la recherche renvoie des infos, et la zone "Rien" change, soit rien n'est trouvé, et il reste "Rien" d'afficher.

quelle fonction serait utile ?
(et je prends évidemment la version 2.2 ?)

merci d'avance,
Is

Edit : comparer un carré de 25x25 pixels suffit.
même, c'est en "bicolore" (couleur fond ou couleur écriture)
=> les fonctions natives sont elles suffisantes / au niveau ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11772
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#16

Message par Tlem »

Bonjour,
De toute évidence, c'est bien l'UDF qu'il vous faut ...
Téléchargez la version 2.2 et jetez un coup d’œil sur la démo. ;)
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
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [UDF] FastFind - Recherches avancées de pixels à l'écran

#17

Message par orax »

Je ne connais pas cet UDF mais la fonction native PixelChecksum devrait également convenir pour cette tâche.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Répondre