[D.2] Suggestion (autoit)

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Bonjour,

Une petite suggestion concernant les bots D.2, pourquoi ne pas utiliser imagesearch plutot que pixelsearch?

Un exemple de code:

Code à inclure (le dll est dispo un peu partout):
Code:
Func _ImageSearchArea($FindImage, $ResultPosition, $x1, $y1, $right, $bottom, ByRef $x, ByRef $y, $Tolerance)
   If $Tolerance > 0 Then $FindImage = "*" & $Tolerance & " " & $FindImage
	
   If @AutoItX64 Then
	  $Result = DllCall("ImageSearchDLL_x64.dll", "str", "ImageSearch", "int", $x1, "int", $y1, "int", $right, "int", $bottom, "str", $FindImage)
   Else
	  $Result = DllCall("ImageSearchDLL.dll", "str", "ImageSearch", "int", $x1, "int", $y1, "int", $right, "int", $bottom, "str", $FindImage)
   EndIf
	
   If $Result = "0" Then Return 0
	
   $Array = StringSplit($Result[0], "|")

   If (UBound($Array) >= 4) Then
	  $x = Int(Number($Array[2]))
	  $y = Int(Number($Array[3]))
		
	  If $ResultPosition = 1 Then
		 $x = $x + Int(Number($Array[4]) / 2)
		 $y = $y + Int(Number($Array[5]) / 2)
	  EndIf
	  Return 1
   EndIf
EndFunc
Exemple de code:
Code:
$image = _ImageSearchArea('secu.png', 1, 791, 242, 831, 281, $x, $y, 10)
   If $image = 1 Then;croix rouge
	  Sleep(200)
	  MouseClick("left", $x, $y, 2, 0)
	  Sleep(500)
	  Return 1
   EndIf;return 1
En gros on fais un screen d'un arbre, perso etc... on retaille est sauve en png ou bmp.

La fonction s'utilise comme suit:
$image = _ImageSearchArea('***image à chercher en png/bmp ***', ***1 ou 2, 1 correspond au centre de l'image, 2 en haut à gauche***, x, y, x[1], y[1] *** ici la zone à scanner***, $x, $y *** les coordonnées de l'image si elle est trouvée***, 1 ***la précision de la recherche de 1(précis) à 254(trouve n'importe quoi)***)

L'avantage est de pouvoir identifier une image plutot qu'un pixel est donc d'éviter les faux-positifs.

Utilisation concrète:
Prennez un screen d'un arbre, blé, etc ... avant récolte, un autre après récolte, et il sera possible d'identifier les chose à récolter.

Note supplémentaire:

Il est possible de rechercher plusieurs images en même temps:

Code:
$image = _ImageSearchArea('green.png', 1, 495, 175, 705, 555, $x, $y, 50)
	  $image2 = _ImageSearchArea('green2.png', 1, 495, 175, 705, 555, $x, $y, 50)
	  $image3 = _ImageSearchArea('green3.png', 1, 495, 175, 705, 555, $x, $y, 50)
	  If $image = 1 Or $image2 = 1 Or $image3 = 1 And $limit1 < 10 Then;atk
		 Return 8
	  EndIf

Enfin, dernière idée, le memory reading reste une option à envisager...
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#2
Fais un tuto dans le forum autoit si tu veux.
 

FastFrench

Membre Actif
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#3
L'idée est intéressante, mais ça ne marche pas.

Les images ne sont pas fixes. C'est déjà vrai pour les couleurs de pixels, bien plus encore pour des images. En plus l'image de ta ressource (existant en pas mal de variantes) est appliquée sur un fond qui lui-même est variable d'un endroit à l'autre...


Cette technique pourrait probablement marcher à certains endroits (barre des actions par exemple ou boutons), mais cela demandera plus de boulot lors des mises à jours, lors ces élements changeront, il faudra refaire les captures.

Good luck...
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Il faudra tout simplement retirer le fond pixel par pixel, mais cela devrait marcher. Je pense que ce serait plus fiable que des pixels.
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#5
Je pense que niveau algorithmique la recherche d'image est plus lourde que la recherche d'un pixel dans une zone.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
Ah oui je confirme, ca consome beaucoup plus
 

FastFrench

Membre Actif
Inscrit
19 Octobre 2010
Messages
214
Reactions
0
#7
h

lolodu93 a dit:
Il faudra tout simplement retirer le fond pixel par pixel, mais cela devrait marcher. Je pense que ce serait plus fiable que des pixels.
Ah oui, avec "tout simplement" dans la phrase c'est tout de suite plus facile... :ugeek:

Va falloir que tu me montres le programme AutoIt correspondant, je suis très curieux de voir ça....

N.B. : l'instruction RemoveBackgroundPixelsFromThisDofusPicture n'existe pas encore dans AutoIt, va falloir l'écrire...
 
Haut Bas