Page 1 sur 1

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

Posté : jeu. 10 mars 2011 18:53
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.



.

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

Posté : jeu. 10 mars 2011 20:09
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?

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

Posté : jeu. 10 mars 2011 22:09
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.

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

Posté : jeu. 10 mars 2011 22:58
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.

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

Posté : jeu. 10 mars 2011 23:52
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.

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

Posté : ven. 11 mars 2011 00:45
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 ;)

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

Posté : ven. 11 mars 2011 12:00
par FastFrench

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

Posté : ven. 11 mars 2011 16:07
par Syric
Je voulais te demander si c'était possible de désactiver le TRACER.TXT et le petit bybye à la fin :D

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

Posté : ven. 11 mars 2011 17:47
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).

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

Posté : sam. 12 mars 2011 22:19
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

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

Posté : sam. 23 avr. 2011 18:51
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

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

Posté : dim. 24 avr. 2011 10:53
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.

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

Posté : sam. 08 avr. 2017 01:49
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

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

Posté : sam. 08 avr. 2017 08:11
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.

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

Posté : jeu. 20 avr. 2017 23:38
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 ?

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

Posté : ven. 21 avr. 2017 06:47
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. ;)

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

Posté : ven. 21 avr. 2017 14:04
par orax
Je ne connais pas cet UDF mais la fonction native PixelChecksum devrait également convenir pour cette tâche.