ImageSearch Versuch

  • Hallo,
    ich wollte mal ImageSearch austesten, habe im Netz bereits etwas gefunden, aber es läuft nicht.
    Ich habe im Desktop ein 1x4 Pixel Bild vom Papierkorb ausgeschnitten und als .bmp Datei in das Skript-ordner verlegt. Benannt "ausschnitt".
    Wenn er dieses Bild findet soll es einfach eine MsgBox einblenden, das bestätigt, dass es gefunden worden ist.

    Im Fenster unten bei Autoit, steht immer Exit code: 0

    [autoit]

    #include <ImageSearch.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Go()
    While 1
    _ImgSearch("ausschnitt")
    Sleep(2000)
    Wend
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _ImgSearch($sPic, $iTimeout = 5000, $bClick = 1, $iTol = 5)
    Local $iX = 0, $iY = 0, $bResult = 0, $iTimer = TimerInit()

    [/autoit][autoit][/autoit][autoit]

    $aPics = StringRegExp($sPic, '([^|]+)', 3)

    [/autoit][autoit][/autoit][autoit]

    While TimerDiff($iTimer) < $iTimeout
    For $i = 0 To UBound($aPics) - 1
    $bResult = _ImageSearch(@ScriptDir & "/Data/" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then ExitLoop(2)
    MsgBox(64,"info", "gefunden",4000)
    Sleep(50)
    Next
    WEnd

    If $bResult=0 Then MsgBox(64,"info", "nichts gefunden",4000)

    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von autoit93 (17. Juli 2013 um 13:10)

  • Moin,

    versuchs doch erstmal so:

    [autoit]

    #include <imagesearch.au3>
    #AutoIt3Wrapper_UseX64=n

    [/autoit][autoit][/autoit][autoit]

    $bResult = _ImageSearch(@ScriptDir & "/Data/ausschnitt.bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then MsgBox(64,"info", "gefunden")

    [/autoit]

    und bloss "#AutoIt3Wrapper_UseX64=n" nicht vergessen, hab ich dir aber schon 2x gesagt ;)

    €dit: Selbstverständlich muss das Bild auch zu sehen sein und darf nicht unter irgendwelchen Fenstern liegen.

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • grad getestet, funktioniert einwandfrei (habe auch ein 1x4 px großes Papierkorb-Bild gemacht ;))

    [autoit]

    #include <imagesearch.au3>
    #AutoIt3Wrapper_UseX64=n

    [/autoit][autoit][/autoit][autoit]

    Global $ix, $iy, $itol, $bresult

    [/autoit][autoit][/autoit][autoit]

    $bResult = _ImageSearch(@ScriptDir & "\ausschnitt.bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then MouseMove($ix, $iy)

    [/autoit]

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Dann habe ich ein anderes Problem.
    Beimir zeigt es einfach nichts an, jetzt steht wieder Exit Code: 0..
    Es tut sich aber einfach nichts.

  • Hast du auch den Backslash "\" genommen?

    und guck dir mal genau deine If-Abfrage an

  • Ja, habe ich..
    die .au3 Dateien sind im Skriptordner und im "Include". Und die .dll ist im System32 Ordner. Daran kann es nicht liegen, oder ?

  • Versuch mal so:

    Spoiler anzeigen
    [autoit]

    #include <ImageSearch.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    _ImgSearch("ausschnitt")
    Sleep(2000)
    Wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ImgSearch($sPic, $iTimeout = 5000, $bClick = 1, $iTol = 5)
    Local $iX = 0, $iY = 0, $bResult = False, $iTimer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    $aPics = StringRegExp($sPic, '([^|]+)', 3)

    [/autoit] [autoit][/autoit] [autoit]

    While TimerDiff($iTimer) < $iTimeout
    For $i = 0 To UBound($aPics) - 1
    $bResult = _ImageSearch(@ScriptDir & "\Data\" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol)
    If $bResult Then ExitLoop(2)
    Sleep(50)
    Next
    WEnd

    If $bResult Then
    MsgBox(64, "info", "gefunden")
    Else
    MsgBox(64, "info", "nichts gefunden")
    EndIf
    EndFunc

    [/autoit]
  • Das ist ja meine UDF :P! Die hast du nicht ganz ordentlich angepasst^^

    So gehts z.B. auch:

    Spoiler anzeigen
    [autoit]

    #include <ImageSearch.au3>

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If _ImgSearch("ausschnitt", 10000, 0) Then
    MsgBox(64,"Info", "Gefunden!",4000)
    Else
    MsgBox(64,"Info", "Nicht gefunden!",4000)
    EndIf
    Sleep(2000)
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    Func _ImgSearch($sPic, $iTimeout = 5000, $bClick = 1, $iTol = 5)
    Local $iX = 0, $iY = 0, $bResult = 0, $iTimer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    $aPics = StringRegExp($sPic, '([^|]+)', 3)

    [/autoit] [autoit][/autoit] [autoit]

    While TimerDiff($iTimer) < $iTimeout
    For $i = 0 To UBound($aPics) - 1
    $bResult = _ImageSearch(@ScriptDir & "/Data/" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then ExitLoop(2)
    Sleep(50)
    Next
    WEnd
    If $bClick AND $bResult Then MouseClick("left", $iX, $iY, 1, 0)
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    Return $bResult
    EndFunc ;==>_ImgSearch

    [/autoit]

    Du hast auch noch keine Steuerung drin, wie man den Bot startet/beendet. So läuft er nun auf ewig, genau wie bei m-obi, musst du hart abbrechen^^... Aber bei dir ist er ja nie in die Funktion gesprungen.
    Wenn du die Messageboxen in die UDF mit einbauen willst, dann machs wie m-obi^^

    LG
    Aca


  • grad getestet, funktioniert einwandfrei (habe auch ein 1x4 px großes Papierkorb-Bild gemacht ;))


    [autoit]

    #include <imagesearch.au3>
    #AutoIt3Wrapper_UseX64=n

    [/autoit] [autoit][/autoit] [autoit]

    Global $ix, $iy, $itol, $bresult

    [/autoit] [autoit][/autoit] [autoit]

    $bResult = _ImageSearch(@ScriptDir & "\ausschnitt.bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then MouseMove($ix, $iy)

    [/autoit]

    Also das klappt jetzt, hatte das Data vor dem slash vergessen :) Bin jetzt schon mal froh, das es funktioniert.


    ----------

    Das funktioniert aber immernoch nicht, es bleibt bei Exit Code: 0 ... ?(

  • Oder erweitere die UDF so:

    Spoiler anzeigen
    [autoit]

    #include <ImageSearch.au3>

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    _ImgSearch("ausschnitt", 10000, 0, 5, 1)
    Sleep(2000)
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    Func _ImgSearch($sPic, $iTimeout = 5000, $bClick = 1, $iTol = 5, $bInfo = 0)
    Local $iX = 0, $iY = 0, $bResult = 0, $iTimer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    $aPics = StringRegExp($sPic, '([^|]+)', 3)

    [/autoit] [autoit][/autoit] [autoit]

    While TimerDiff($iTimer) < $iTimeout
    For $i = 0 To UBound($aPics) - 1
    $bResult = _ImageSearch(@ScriptDir & "/Data/" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then ExitLoop(2)
    Sleep(50)
    Next
    WEnd
    If $bClick AND $bResult Then MouseClick("left", $iX, $iY, 1, 0)
    If $bInfo Then
    If $bResult Then
    MsgBox(64,"Info", "Gefunden!",4000)
    Else
    MsgBox(64,"Info", "Nicht gefunden!",4000)
    EndIf
    EndIf
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    Return $bResult
    EndFunc ;==>_ImgSearch

    [/autoit]


    Und dein Fehler ist, dass du die Datei im Script-Ordner hast, für die UDF wird aber das verlangt: _ImageSearch(@ScriptDir & "/Data/" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol).
    Zur Ordnung also, dass das Bild in einem Order "Data" im Scriptordner ist ;)...


    LG
    Aca

  • Dann mach doch da auch das data weg.

    Spoiler anzeigen
    [autoit]

    #include <ImageSearch.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    _ImgSearch("ausschnitt")
    Sleep(2000)
    Wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ImgSearch($sPic, $iTimeout = 5000, $bClick = 1, $iTol = 5)
    Local $iX = 0, $iY = 0, $bResult = False, $iTimer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    $aPics = StringRegExp($sPic, '([^|]+)', 3)

    [/autoit] [autoit][/autoit] [autoit]

    While TimerDiff($iTimer) < $iTimeout
    For $i = 0 To UBound($aPics) - 1
    $bResult = _ImageSearch(@ScriptDir & "\" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol)
    If $bResult Then ExitLoop(2)
    Sleep(50)
    Next
    WEnd

    If Not $bResult Then
    MsgBox(64, "info", "gefunden")
    Else
    MsgBox(64, "info", "nichts gefunden")
    EndIf
    EndFunc

    [/autoit]
  • Oh cool :D
    Ja jetzt klappt es, aber Endlos-Schleife, es kommt die ganze Zeit die MsgBox, obwohl ich es wegklicke. Das Exit of loop wird dann wohl nicht klappen ?

    P.s: ich habe einen Data Ordner im Skriptordner, ihr habt mich flasch verstanden.

    Einmal editiert, zuletzt von autoit93 (16. Juli 2013 um 09:41)

  • Schwer zu sagen, auf wen/was du dich beziehst und welchen Code du nu nimmst...^^ Deine Zitierart ist schlimm xD...

    Das Exit-Loop in der Funktion bezieht sich nur auf diese Funktion. In der UDF steckt halt drin, dass man eine maximale Suchzeit einstellen kann. Wenn man da aber 10 Sekunden einstellt und er findet es nach 1 Sekunde, kann er ja aufhören zu suchen ;). Das macht das ExitLoop.
    Wenn er nur 1x suchen soll, musste das so in der Art machen:

    Spoiler anzeigen
    [autoit]

    #include <ImageSearch.au3>

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If _ImgSearch("ausschnitt") Then Exit
    Sleep(2000)
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    Func _ImgSearch($sPic, $iTimeout = 5000, $bClick = 0, $iTol = 5, $bInfo = 1)
    Local $iX = 0, $iY = 0, $bResult = 0, $iTimer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    $aPics = StringRegExp($sPic, '([^|]+)', 3)

    [/autoit] [autoit][/autoit] [autoit]

    While TimerDiff($iTimer) < $iTimeout
    For $i = 0 To UBound($aPics) - 1
    $bResult = _ImageSearch(@ScriptDir & "/Data/" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then ExitLoop(2)
    Sleep(50)
    Next
    WEnd
    If $bClick AND $bResult Then MouseClick("left", $iX, $iY, 1, 0)
    If $bInfo Then
    If $bResult Then
    MsgBox(64,"Info", "Gefunden!",4000)
    Else
    MsgBox(64,"Info", "Nicht gefunden!",4000)
    EndIf
    EndIf
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    Return $bResult
    EndFunc ;==>_ImgSearch

    [/autoit]


    LG
    Aca


  • Ja, das verstehe ich ja, aber er geht nicht aus der Schleife raus ?( Also es findet es, dann klick ich das Fenster weg, dann kommt nochmal gefunden.

    Jetzt bei dem findet er nur einmal, das stimmt.

    edit: meine Zitierung ist sehr schlimm :D hatte glaube ich paar mal erst auf auswählen gedrückt

  • [autoit]

    While TimerDiff($iTimer) < $iTimeout
    For $i = 0 To UBound($aPics) - 1
    $bResult = _ImageSearch(@ScriptDir & "/Data/" & $aPics[$i] & ".bmp", 1, $iX, $iY, $iTol)
    If $bResult = 1 Then ExitLoop
    Sleep(50)
    Next
    if $bResult = 1 then ExitLoop
    WEnd

    [/autoit]

    sowas in der art schonmal in betracht gezogen?
    (die option bei exitloop hab ich noch nie benutzt)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Doch klar ist er aus der Schleife raus, sonst wären ja auch die Messageboxen nicht gekommen.
    Aber in deiner Hauptschleife, wo du die Funktion ausgerufen hast, war kein "Ausgang". Die Hauptschleife ist "immer" eine Endlosschleife und man muss sich überlegen, wie man die verlassen will...^^ Bei meiner Änderung habe ich ihm nun gesagt, wenn die Funktion erfolgreich war, dann soll er das Programm beenden.
    Anstatt Exit könntest du auch ExitLoop schreiben, denn wenn er die Hauptschleife verlässt und da unter nichts mehr außerhalb von Funktionen steht, terminiert das Programm auch!

    x0r: Was soll das bringen? O.o Das ändert nichts an der Funktionalität, erhöht nur die Komplexität.

  • Das ist auch endlos, habs eben getestet.

    Doch klar ist er aus der Schleife raus, sonst wären ja auch die Messageboxen nicht gekommen.
    Aber in deiner Hauptschleife, wo du die Funktion ausgerufen hast, war kein "Ausgang". Die Hauptschleife ist "immer" eine Endlosschleife und man muss sich überlegen, wie man die verlassen will...^^ Bei meiner Änderung habe ich ihm nun gesagt, wenn die Funktion erfolgreich war, dann soll er das Programm beenden.
    Anstatt Exit könntest du auch ExitLoop schreiben, denn wenn er die Hauptschleife verlässt und da unter nichts mehr außerhalb von Funktionen steht, terminiert das Programm auch!

    x0r: Was soll das bringen? O.o Das ändert nichts an der Funktionalität, erhöht nur die Komplexität.

    Achso okey, jetzt habe ich verstanden was du meinst :)

  • von miraus kann die komplexität bzw unübersichtlichkeit sehr hoch sein, solange es funktioniert..
    durchsteigen muss im endeffekt jeder einzelne für sich.

    ich würde, wenn die schleife bei ubound angekommen ist und result immernoch 0 ist, ne zweite variable auf 1 setzen, die dann die äußere schleife beendet.
    so war das eigentlich auch eben gemeint, allerdings wirklich sinnfrei :D

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.