SearchImage Frage

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

nacken012
Posts: 90
Joined: 22 Jul 2016, 14:39

SearchImage Frage

19 Dec 2018, 09:01

Hallo Leute

Ich habe mal wieder eine Frage und zwar geht es da drum:

In einem Spiel gibt es sagen wir mal 10 Objekte auf dem Bildschirm die gleich aussehen.

Jetzt dachte ich mir, ich lasse per ToolTip einfach eine Zahl beim 1 Fund drüber schreiben so das er beim 2 ten
Durchgang das ja nicht mehr finden kann.

Aber da habe ich wohl falsch gedacht, er findet Objetkt Nummer 1 auch beim 2ten Durchgang, obwohl da jetzt eine 1 drüber steht.

Wie kann man es machen das er beim ersten Fund über dem Objekt was drüber malt, so das er beim 2´ten Durchgang das Objekt nicht mehr finden kann ?

Code: Select all

F3::

Sleep, 2000

Sleep, 300

Loop, 10
{
Zahl += 1
CoordMode, ToolTip, Screen
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *100 testbild.png
if ErrorLevel=1
    goto, Nicht-gefunden
if ErrorLevel=0
MouseMove, %FoundX%, %FoundY%, 1	
Sleep, 100
ToolTip, %Zahl%,,,%Zahl%
sleep, 1000

MouseMove, 50, 50, 1
sleep, 400
}
return

Nicht-gefunden:
MsgBox, nix mehr da

F8::
Reload
return
Mfg. Horst
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: SearchImage Frage

19 Dec 2018, 12:18

So wirst du das nicht lösen.
Du musst den Suchbereich begrenzen je nachdem wo du schon ein Bild gefunden hast.

Eine alternative wäre es natürlich Gdip_ImageSearch zu verwenden - da kannst du den Screenshot den du aufnimmst bearbeiten wie du willst und musst nicht auf deinen Bildschirm malen.
Zudem wirst du eine höhere Geschwindigkeit haben.
Recommends AHK Studio
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: SearchImage Frage

20 Dec 2018, 17:26

Hallo, habe mich heute mit Gdip_ImageSearch beschäftigt, doch bekomme es nicht hin. Das Ergebnis ist immer "Returned: 0"

RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,0,0,0,0,0,0xFFFFFF,1,0)[/code]

Wofür stehen die Werte: 0,0,0,0,0,0xFFFFFF,1,0?
LG
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: SearchImage Frage

21 Dec 2018, 03:14

Ich nehme mal an, dass du https://github.com/MasterFocus/AutoHotk ... Search.ahk verwendest.

Laut Dokumentation stehen die ersten 4 Zahlen für den Bereich in dem Bild, den du durchsuchen möchtest.
In deinem Fall - 0, 0, 0, 0 - gibt es eine Sonderregelung, die dafür sorgt, dass das komplette Bild durchsucht wird.
Die Parameter funktionieren wie die X1, Y1, X2, Y2 Parameter bei ImageSearch.

Die nächste 0 gibt die Variation an - genau wie die * Option bei ImageSearch.

0xFFFFFF gibt die Farbe an die Transparent gemacht werden soll.
In deinem Fall machst du Weiß transparent.
Da du das Wahrscheinlich nicht willst würde ich dir empfehlen hier "" einzutragen.

Die 1 gibt die Suchorientierung an. 1 bedeutet, dass Zeilenweise von oben nach unten und von links nach rechts gelesen wird.

Die letzte 0 gibt an wie oft nach der Nadel im Heuhaufen gesucht werden soll.
Die 0 macht hier keinen Sinn und bedeutet, dass nach allen nadeln gesucht werden soll, die sich im Heuhaufen verstecken.

Woran es jetzt genau liegt, dass dein ImageSearch fehlschlägt ist schwer zu sagen, ohne den Rest des codes zu kennen.
Recommends AHK Studio
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: SearchImage Frage

21 Dec 2018, 13:45

Hallo und danke für die Super Erklärung. Ich habe es versucht umzusetzen, doch klappt immer noch nicht. In Heuhaufen sind 7Punkte versteckt, möchte alle 7Punkte nacheinander mit der Maus anklicken.

Code: Select all

#NoEnv
SetBatchLines, -1
Process, Priority,, High

#Include GDIP.ahk
#Include Gdip_ImageSearch.ahk

OnExit, EXIT_LABEL

gdipToken := Gdip_Startup()

bmpHaystack := Gdip_CreateBitmapFromFile("foto/heu.png")
bmpNeedle := Gdip_CreateBitmapFromFile("foto/nad.png")
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,0,0,0,0,30,"",1,7)

Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
MsgBox, % "Returned: " RET "`n`n" LIST



EXIT_LABEL: ; be really sure the script will shutdown GDIP
Gdip_Shutdown(gdipToken)
EXITAPP
Attachments
nad.png
nad.png (922 Bytes) Viewed 2546 times
heu.png
heu.png (21.25 KiB) Viewed 2546 times
nacken012
Posts: 90
Joined: 22 Jul 2016, 14:39

Re: SearchImage Frage

30 Dec 2018, 03:13

Hallo, lange habe ich gebastelt und probiert, jetzt klappt es endlich :-)

Wichtig: das Nad.png darf kein Transparenten Hintergrund haben, damit bekomme ich es nicht hin

Code: Select all

#Include GDIP.ahk
#Include Gdip_ImageSearch.ahk
pToken := Gdip_Startup()
winName := "ahk_exe chrome.exe"
clientW := 1920 ; set your client area width
clientH := 1080 ; set your client area height
WinGetPos, x, y, w, h, %winName%
winBorder := (w-clientW)/2
x := x+winBorder
y := y+(h-clientH-winBorder)
snap := Gdip_BitmapFromScreen(x "|" y "|" clientW "|" clientH)
Gdip_SaveBitmapToFile(snap, "Bilder/ScreenShot.png")
Gdip_DisposeImage(snap)

bmpHaystack := Gdip_CreateBitmapFromFile("Bilder/ScreenShot.png")
bmpNeedle := Gdip_CreateBitmapFromFile("Bilder/TannenBaum.png")
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,0,0,0,0,10,"",1,0)

Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)

ZeilenArray := StrSplit(LIST, "`n", "`r")
For ZeilenNummer, ZeilenInhalt In ZeilenArray {
	xy:= StrSplit(ZeilenInhalt, ",")
SeitenAngabeX := xy[1]
SeitenAngabeY := xy[2]
	MouseMove, %SeitenAngabeX%, %SeitenAngabeY%, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1500
   MouseMove, 800, 690, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 1000
   MouseMove, 1266, 932, 0
   Sleep, 100
   Click, Left, 1
   Sleep, 100
   MouseMove, 100, 100, 0
   Sleep, 1500
   }
   EXIT_LABEL: ; be really sure the script will shutdown GDIP
Gdip_Shutdown(gdipToken)
Gdip_ShutDown(pToken)
Return
User avatar
Scr1pter
Posts: 1272
Joined: 06 Aug 2017, 08:21
Location: Germany

Re: SearchImage Frage

01 Jan 2019, 18:28

Kann man pauschal sagen, dass Gdip-ImageSearch zuverlässiger ist?
Hatte keine Infos dazu finden können.

Bisher hab ich nur mit dem Standard-ImageSearch gearbeitet, was immer ausreichend war.

Grüße
Please use [code][/code] when posting code!
Keyboard: Logitech G PRO - Mouse: Logitech G502 LS - OS: Windows 10 Pro 64 Bit - AHK version: 1.1.33.09
nacken012
Posts: 90
Joined: 22 Jul 2016, 14:39

Re: SearchImage Frage

02 Jan 2019, 04:48

Also ich bin total zufrieden, hatte vorher auch nur mit dem normalen ImageSearch gearbeitet, aber hatte jetzt 1 Objekt, wo es so nicht machbar war mit dem normalen.
Für 1 Spiel brauchte ich was anderes, es stehen unterschiedlich viele Bäume auf unterschiedlich Positionen.

Das ist das gdip ImageSearch echt perfekt, ich lasse erst ein screenshot vom Bild erstellen und suche dann nach dem Objekten und bekomme dann Koordinaten (LIST) zurück und lasse sie mir dann aufsplitten, ansteuern und anklicken.

Die Trefferquote ist genial
nacken012
Posts: 90
Joined: 22 Jul 2016, 14:39

Re: SearchImage Frage

16 Feb 2019, 00:23

Guten Morgen

Habe nochmal 1 Frage zu meiner Image Suche

Um auf 100% Treffer Quote überall zu kommen hatte ich folgende Idee:

Original:
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,OutputList,0,0,0,0,11,"",1,0)

jetzt dachte ich, ich erhöhe die Variation von 11 auf sagen wir 20

jetzt bekomme ich aber doppelte treffer, leider nicht absolut die gleichen Koordinaten, sondern etwas andere, sonst würde ich
sie einfach per:

FileDelete, OutputList.txt
Sort, OutputList, U
Sleep, 100
FileAppend,%OutputList%, OutputList.txt

doppelte Einträge löschen lassen.

Es kommen jetzt z.B. folgende Koordinaten raus:

1024, 735
1024, 736

also um 1 Pixel andere Werte.

Ist es möglich, da einen abgleich zu machen das er doppelte Werte +- 2 Pixel aus der Variable entfernt ?

Die Liste lasse ich zur Zeit nur als .txt speichern, damit ich sehe was die Variable mir ausspuckt.

Hoffe ich konnte es so einiger Maßen erklären.

lg Horst

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 53 guests