[AutoIt] ImageSearch

05/29/2016 17:44 Melli-#1
Hallo Leute, ich möchte euch zeigen wie ihr am einfachsten einen ImageSearch Bot erstellen könnt.

Was ist ImageSearch?
ImageSearch ist eine Funktion, mit der man nach bestimmten Bildern auf dem Bildschirm suchen kann, und dann damit interagieren kann. (z.B. Wenn Bild gefunden, dann draufdrücken..)

Wie benutze ich ImageSearch? (1/2)
Zuerst ladet ihr euch die ImageSearch.au3 herunter und die ImageSearchDLL.dll
Diese findet ihr hier: [Only registered and activated users can see links. Click Here To Register...]
Die ImageSearch.au3 tut ihr in eurem AutoIt Ordner unter Include.
Dateipfad könnte so aussehen: C:Program Files (x86)AutoIt3Include
Jetzt sind wir noch nicht fertig! Die ImageSearchDLL.dll tut ihr in eurem Windows Ordner unter System32

Auch hier nachzulesen: [Only registered and activated users can see links. Click Here To Register...]


Wie benutze ich ImageSearch? (2/2)
Als aller erstes müsst ihr die ImageSearch.au3 includieren! Dies tut ihr in der aller ersten Zeile mit dem "Befehl"
Code:
#include <ImageSearch.au3>
Nun haben wir die ImageSearch.au3 mit eingebunden und können jetzt die Funktionen nutzen! Ich beschäftige mich hier nur mit _ImageSearch NICHT mit _ImageSearchArea!

Ich habe es immer gerne wenn ich ImageSearch verwende, das dieses Programm Steuerbar mit HotKeys (F1,F2) ist. Um dies zu tun schreibt ihr nach dem ihr dieses #include schriebt:
Code:
HotKeySet("{F1}","starten")
HotKeySet("{F2}","stoppen")

While 1
   Sleep(1)
WEnd

Func starten()
   
EndFunc

Func stoppen()
   Exit 1
EndFunc
Die While-Schleife kann auch ganz am Ende des Codes getan werden, ich hab es allerdings gleich am Anfang.

Gehen wir nun zu dem eigentlichen Befehl, und klamüsern erstmal alles auseinander.

Code:
$search = _ImageSearch("datei.bmp",1,$x,$y,0)
$search - eine von uns festgelegte Variable
_ImageSearch - Funktion aus der ImageSearch.au3
"datei.bmp" - hier das Bild was wir suchen (geht auch mit anderen Formaten z.B. "haus.png" etc..)
1 - die Maus wird auf die Mitte des Bildes drücken
$x,$y - hier werden die Koordinaten gespeichert wo das Bild gefunden wurde
0 - Toleranzwert (je höher der Toleranzwert, desto höher ist die Chance das die Funktion auch was anderes findet!)

Bevor wir aber den Befehl von oben kopieren & einfügen, muss man vorher noch $x und $y deklarieren! Undzwar sind die Werte der beiden Variablen "0".

Quasi:
Code:
   $x = 0
   $y = 0
   $search = _ImageSearch("datei.bmp",1,$x,$y,0)
Jetzt können wir abfragen ob die Suche Erfolgreich (1) war!

Dies tut man mit:
Code:
 If $search = 1 Then
	  
   Else
	  MsgBox("","Error 1","Bild wurde nicht gefunden")
   EndIf
Jetzt dürft ihr selber entscheiden was getan werden soll, wenn das Bild gefunden wurde. Ich benutze oft ImageSearch, um dann auf das Bild draufzudrücken, dies tut man wie folgt:

Code:
 If $search = 1 Then
	  MouseClick("left",$x,$y,1)
   Else
	 MsgBox("","Error 1","Bild wurde nicht gefunden") 
   EndIf
Da die Werte der Variablen $x,$y überschrieben werden, mit den Koordinaten wo das Bild gefunden wurde, können wir auch hier einen Klick darauf machen!


Nach dem MouseClick könntet ihr dann wieder ein anderes Bild suchen, achtet darauf das keine Variable 2 mal vorkommt! Auch nicht das x und das y!



Mit freundlichen Grüßen, Melli-
06/04/2016 02:06 Moneypulation#2
Schön, dass du dir die Zeit genommen hast, die ImageSearch Funktion zu erklären. Ich find das Tutorial leider nicht sehr gelungen. Aber du kannst es ausbauen und überarbeiten, da die Funktion mMn sehr nützlich ist und sie ein ordentliches Tutorial verdient hat. Daher komm ich auch direkt mal zu meinen Kritikpunkten/Verbesserungsvorschlägen:

1. Die ImageSearchDLL.dll würde ich nicht in den Windowsordner packen, außer man will das Script nur für sich benutzen. Da hier aber viele Bots o.Ä. schreiben wollen, würde ich die DLL lokal vom Script aus speichern, am besten in einen Ordner, wo sich dann auch die ganzen anderen Ressourcen, wie z.B. die zu suchenden Bilder, befinden.
2. ̶i̶̶n̶̶c̶̶l̶̶u̶̶d̶̶i̶̶e̶̶r̶̶e̶̶n̶ --> importieren
3.
Code:
While 1
   Sleep(1)
WEnd
Den Sleep änderst du bitte schnell in mind. 100, bevor alpines hier auftaucht.
4. Die Parameter kann man ruhig ausführlicher erläutern. Was hat ImageSearch für einen Rückgabetyp? Wo müssen sich die Bilder befinden, wenn ich einfach name.bmp eingebe? Funktioniert das auch mit transparenten Bildern?
5. ImageSearch lässt sich gut an Beispielen erklären. Man muss jetzt keinen ganzen Bot schreiben, aber man könnte sich ein kleines Spiel herausnehmen und selbst mit Pseudo Code zeigen, in welche Richtung das gehen würde.
06/06/2016 07:25 alpines#3
Quote:
Originally Posted by Moneypulation View Post
Den Sleep änderst du bitte schnell in mind. 100, bevor alpines hier auftaucht.
Ich sollte beim nächsten Mal die Threads nicht überfliegen sonst verpasse ich hier noch was :D

Die Sleep-Funktion von AutoIt sleept immer mindestens 10ms, das ist ganz leicht nachprüfbar mit folgendem Script.
Code:
$tmr = TimerInit()
Sleep(1)
MessageBox(0, "", TimerDiff($tmr))
Sleep(100) sollte auch eigentlich in den meisten Fällen reichen, da das hier aber eine Schleife ist die das Programm nur am laufen hält, kannst du auch 1000ms oder mehr nehmen.
06/11/2016 17:48 .TheBlueOptic#4
Code:
#include<ImageSearch.au3>

HotKeySet("(NUMPAD2)","starten")
HotKeySet("(NUMPAD3)","beenden")
$x1=0
$y1=0
$x2=0
$y2=0

While 1
   Sleep(1)
WEnd

Func starten()
	  While 1
		 $resulte=_ImageSearch("IdleWC.png",1,$x1,$y1,0)
			If $resulte=1 Then
			  $resulte_ImageSearch("yewtext.png",1,$x2,$y2,0)
				  IF $resulte=1 Then
					 MouseClick("LEFT",$x2,$y2)
					 EndIf
				  EndIf
			   WEnd
			EndFunc

Func beenden()
   exit 0
EndFunc
was stimmt damit nicht ? nichts passiert
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
hier sind die zwei bilder
06/11/2016 20:55 Melli-#5
Quote:
Originally Posted by .TheBlueOptic View Post
Code:
#include<ImageSearch.au3>

HotKeySet("(NUMPAD2)","starten")
HotKeySet("(NUMPAD3)","beenden")
$x1=0
$y1=0
$x2=0
$y2=0

While 1
   Sleep(1)
WEnd

Func starten()
	  While 1
		 $resulte=_ImageSearch("IdleWC.png",1,$x1,$y1,0)
			If $resulte=1 Then
			  $resulte_ImageSearch("yewtext.png",1,$x2,$y2,0)
				  IF $resulte=1 Then
					 MouseClick("LEFT",$x2,$y2)
					 EndIf
				  EndIf
			   WEnd
			EndFunc

Func beenden()
   exit 0
EndFunc
was stimmt damit nicht ? nichts passiert
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
hier sind die zwei bilder
Dein Fehler lag daran, das du nachdem du If $resulte=1 Then
du bei "$resulte_ImageSearch" ein "=" vergessen hast. Außerdem darfst du zwei Bilder nicht auf eine Variable festlegen, deswegen schrieb ich im umgeschriebenen Script "$resulte1", so kannst du dir sicher sein, das du dies als Fehlerquelle ausschließen kannst, falls es nicht klappen sollte.
Code:
#include<ImageSearch.au3>

HotKeySet("(NUMPAD2)","starten")
HotKeySet("(NUMPAD3)","beenden")
$x1=0
$y1=0
$x2=0
$y2=0

While 1
   Sleep(1)
WEnd

Func starten()
	  While 1
		 $resulte=_ImageSearch("IdleWC.png",1,$x1,$y1,0)
			If $resulte=1 Then
			  $resulte1= _ImageSearch("yewtext.png",1,$x2,$y2,0)
				  If $resulte1=1 Then
					 MouseClick("LEFT",$x2,$y2)
					 EndIf
				  EndIf
			   WEnd
			EndFunc

Func beenden()
   exit 0
EndFunc
06/11/2016 23:17 .TheBlueOptic#6
Ich habe die DLL alle Bilder und die .au3 Dateien in einem Ordner aber er gibt mir immer.
"C:\Program Files (x86)\AutoIt3\Include\ImageSearch.au3" (44) : ==> Subscript used on non-accessible variable.:
if $result[0]="0" then return 0
if $result^ ERROR
hab auch schon als admin ausgefürt

01/21/2021 19:21 wrabbit#7
Hallo,
ich bin ein absoluter Newbie was das programmieren betrifft.
Habe mir für ein Spiel einen Bot mit AutoIt erstellt welches auch läuft.
Das einzige was mich daran stört ist die lange Liste, welche sich auch ständig erweitert, da im laufe der Zeit immer mehr Bilder hinzukommen. Bisher habe ich die Liste erweitert wie man es gut im Script erkennen kann.
Ich denke aber dass es auch einfacher geht, weiß aber nicht wie.
Vielleicht hat ja einer eine Idee und hilft mir auf die Sprünge.
Ich freue mich auf eine Antwort von euch.
Hier nun der Script:
Ich hoffe ich füge ihn richtig ein :-)