Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Bewegungsrichtung (2D) mit Pixelsearch berechnen?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe!
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ChiLLed
Gast





BeitragVerfasst am: Mo Mai 12, 2008 9:50 pm    Titel: Bewegungsrichtung (2D) mit Pixelsearch berechnen? Antworten mit Zitat

Hab mit SuFu nichts gefunden daher:

Voraussetzungen:
1. Es ist möglich mit Pixelsearch ein Objekt, was eine Farbe oder einen Farbbereich enthält, zu fixieren (also eine unbegrenzte Anzahl an Koordinaten zu ermitteln). Die Fixierung des Objekts erfolgt erst durch eine weite Suche um den Cursor und wird danach durch einen kleineren Suchradius gefestigt.
2. Mittels mathematischer Regression lässt sich eine Gerade berechnen, dessen (+/-)Steigung die Bewegungsrichtung des Objekts darstellt.

Problemstellung:
1. Wie lass ich Pixelsearch nur 0x0000XX suchen...ich brauche nur eine einfarbige Erkennung, aber das von 50 aufwärts (um Schwarzerkennung zu vermeiden).
2. Die Fixierung. Ich habe mir Functions und GoSub angeguckt, aber wie ich die ermittelten Koordinaten in Arrays speicher und danach weiterverwende ist mir ein Rätsel.

Das ist schonmal ein Anfang meinerseits (der übrigens, wahrscheinlich durch den unendlichen Loop der Funktion, zum Absturz des Scriptes führt) der das Objekt fixiert und "verfolgt".
Code:

~*Enter::  ;pause
~*NumpadEnter::
Suspend
return

f::
MouseGetPos, PosX, PosY
xa1 := PosX - 50
xa2 := PosX + 50
ya1 := PosY - 50
ya2 := PosY + 50
Pixelsearch, FX1, FY1, %xa1%, %ya1%, %xa2%, %ya2%, 0x0000CD, 50, Fast
MouseMove, %FX1%, %FY1% ;zwecks veranschaulichung
Focus(FX1, FY1)
return

Focus(FX1, FY1)
{
xb1 := FX1 - 10
yb1 := FY1 - 10
xb2 := FX1 + 10
yb2 := FX1 + 10
Pixelsearch, FX1, FY1, %xb1%, %yb1%, %xb2%, %yb2%, 0x0000CD, 50, Fast
MouseMove, %FX1%, %FY1%  ;zwecks veranschaulichung
Focus(FX1, FY1)
}
return


Ich bin, was Arrays angeht (die vll die Lösung darstellen), noch nicht so bewandert und hoffe auf eure Hilfe bei meinem Problem.
Über die mathematischen Kenntnisse um die Regression zu berechnen verfüge ich und die Richtung (also ob die Steigung positiv oder negativ ist) lässt sich sicher anhand des ersten und letzten Punktes einfach bestimmen (auch wenn das Object kreise läuft Rolling Eyes ).
Nach oben
BoBo²
Gast





BeitragVerfasst am: Mo Mai 12, 2008 11:38 pm    Titel: Antworten mit Zitat

Zitat:
auch wenn das Object Kreise läuft
Möchtest du ein dynamisch positioniertes Objekt erfassen, oder ein pro Session beliebig, doch statisch plaziertes Objekt?
Nach oben
ChiLLed
Gast





BeitragVerfasst am: Di Mai 13, 2008 2:48 am    Titel: Antworten mit Zitat

Oh ich bemerke das habe ich gar nicht wirklich erklärt Embarassed

Ich versuche, sich bewegende Objekte zu "erfassen" und sie dann weiter zu "verfolgen". Der Vorgang dient dazu ihre Bewegung vorherzusagen.

Das Objekt ist nur in der Hinsicht definiert, das es Pixel einer eindeutigen Farbe besitzt (0xYY0000, 0x00YY00, 0x0000YY Y=00-FF), und über einen gewissen Zeitraum in Bewegung bleibt.

Gerade so ensteht doch das Problem das ich nicht einen Vektor (also 2 Punkte) herauslesen kann (-->ImageSearch) und erst die eigentliche Bewegung berechnen muss.

Zur Veranschaulichung:

Die beiden schwarzen Kreise stellen das Objekt zum Zeitpunkt START und ENDE dar. Die roten Punkte sind durch PixelSearch erkannte Koordinaten.
Die blaue Linie ist die Regressionsgerade, die Bewegungsrichtung, die sich anhand der roten Punkte berechnen lässt.

Mir ist bekannt das Pixelsearch nur Reihen bzw. Spaltenweise suchen kann, aber ich denke ich kann auch das durch Mathematik ausgleichen Wink.

Hoffe jetzt ists klar Smile danke für die schnelle Hilfe BoBo...scheinst dich ja häufig hier im Forum mit Problemen auseinanderzusetzen.
Nach oben
Z Gecko
Gast





BeitragVerfasst am: Di Mai 13, 2008 3:58 am    Titel: Antworten mit Zitat

Zitat:
1. Es ist möglich mit Pixelsearch ein Objekt, was eine Farbe oder einen Farbbereich enthält, zu fixieren (also eine unbegrenzte Anzahl an Koordinaten zu ermitteln). Die Fixierung des Objekts erfolgt erst durch eine weite Suche um den Cursor und wird danach durch einen kleineren Suchradius gefestigt.

Du könntest dir eine eigene Pixelsearch Function schreiben,
die müsste PixelGetColor in einem Loop ausführen.
An die einzelnen Farbwerte kommst bequem mit NumPut und substr,
wie hier http://www.autohotkey.com/forum/topic31564.html von SKAN beschrieben.
Diese Function könnte dann auch beliebig viele Werte zurückgeben.
Wie es mit der Performance so einer Function aussieht, weiß ich allerdings nicht. Confused


Ach, und ist dein gesuchtes Objekt eigentlich das einzige in diesem Farbbereich?
Oder gibt es da noch anderes im selben Farbbereich?
Nach oben
BoBo¨
Gast





BeitragVerfasst am: Di Mai 13, 2008 10:14 am    Titel: Antworten mit Zitat

Gehirnfurz. Ich denke ich würde die Oberfläche entsprechend der Größe des Objekts 'rastern' (oder evtl nur 'ver-spalten') und auf Veränderung entlang jeder einzelnen virtuellen Rasterlinie (SetTimer) checken.
Nach oben
ChiLLed
Gast





BeitragVerfasst am: Di Mai 13, 2008 11:11 pm    Titel: Antworten mit Zitat

BoBo, die Fixierung funktioniert doch sogar schon mit dem kleinen Stück Code da oben...das Problem ist das es abstürzt, und keine koordinaten ausspuckt.
Ich will das Objekt nur in einem kleinen Kreis um die Maus herum suchen.
Zitat:
Die Fixierung des Objekts erfolgt erst durch eine weite Suche um den Cursor und wird danach durch einen kleineren Suchradius gefestigt.


Wie die Methode von SKAN etwas mit meinem Problem zu tun hat ist mir unklar.
SKAN hat Folgendes geschrieben:
I got curious and wanted to try.
The following changes colors as BLACK > BLUE > CYAN > WHITE > YELLOW > RED

Bei mir besteht das Problem das ich nur nach einem Farbbereich (blau/grün/rot) suchen will, diesen aber mit shaders, also zb die werte 0x000096 bis 0x0000FF. Grün und blau sollen 00 bleiben, da spielt Pixelsearch aber nicht mit...
Nach oben
Z Gecko
Gast





BeitragVerfasst am: Mi Mai 14, 2008 2:47 am    Titel: Antworten mit Zitat

Geht ja auch nicht mit Pixelsearch. Daher sagte ich auch:
Zitat:
Du könntest dir eine eigene Pixelsearch Function schreiben,
die müsste PixelGetColor in einem Loop ausführen.


Du mußt dir eine eigene Function schreiben, die mittels PixelGetColor für jeden Punkt im Suchbereich die Farbe zurückgibt und dann mittels der Methode von SKAN den Farbkanal extrahieren, der dir wichtig ist. Den prüfst Du dann mittels if-statements darauf, ob er in den gewünschten wertebereich fällt.
Damit hast Du dann automatisch ALLE Punkte, auf die das zutriffst.

Aus denen könntest du dann den Mittelwertwert ermitteln, und hast damit deine Objektposition.
Nach oben
ChiLLed
Gast





BeitragVerfasst am: Mi Mai 14, 2008 8:14 am    Titel: Antworten mit Zitat

Ne danke für den Vorschlag aber das ist viel zu ressourcenlastig. Ich probiere es erstmal mit Pixelsearch.

Können wir uns auf das Problem konzentrieren wie ich 20-50 Koordinaten der aufeinanderfolgenden Pixelsearch Vorgänge bekomme und sie auch später bequem weiterverwenden kann? Natürlich könnte ich den Vorgang 20-50 mal wiederholen aber da das dann mehrere hundert Zeilen Code brauchen und ich hab auf eine elegantere Lösung gehofft Smile.
Nach oben
BoBo¨
Gast





BeitragVerfasst am: Mi Mai 14, 2008 9:30 am    Titel: Antworten mit Zitat

Zitat:
Grün und blau sollen 00 bleiben, da spielt Pixelsearch aber nicht mit...
PixelSearch in einen Loop einbauen. Den variablen Farbwert beliebig erhöhen und den Hexwert desselben mittels SetFormat, Hex ermitteln. Diesen mit den statischen Werten concatinieren und den 'Gesamtfarbwert' an PixelSearch übergeben.
Nach oben
Z Gecko
Gast





BeitragVerfasst am: Mi Mai 14, 2008 11:23 am    Titel: Antworten mit Zitat

Also wenn Du bei Pixelsearch bleiben willst, heist daß,
dann erstmal pro Punkt 10 - 20 Pixelsearches machen, um mit Bobos Methode den Farbmatch zu bekommen
und das ganze dann 20 -50 mal wiederholen um an die 20 -50 Punkte zu kommen.
Das sind dann 200 - 1000 Pixelsearchs.
Ob die jetzt soviel schneller sind als z.B. 10.000 PixelGetColor, die man braucht für eine Fläche von 100 x 100 Pixeln, müßte man erstmal austesten.

Ich würde erstmal einen Geschwindigkeitsvergleich machen, um zu sehen wie die beiden Kommandos wirklich zueinander stehen.
Nach oben
Z Gecko
Gast





BeitragVerfasst am: Mi Mai 14, 2008 1:36 pm    Titel: Antworten mit Zitat

ich hab mal meinen Vorschlag rudimentär ausgearbeitet:
Code:
setbatchlines -1
return
MButton::
MouseGetPos, X , Y
startX := X
starty := Y
endx := X + 100
endy := Y + 100
minblue = 50
maxblue = 100
match := getpixelmatchblue( startx, starty, endx, endy, minblue, maxblue)
MsgBox, Found: %match% at x: %matchx% - y: %matchy%
return


getpixelmatchblue( startx, starty, endx, endy, minblue, maxblue )
{
   global matchx, matchy
   loopx := endx - startx
   loopy := endy - starty
   match := 0
   loop, %loopx%
   {
      tempx := A_Index + startx
      loop, %loopy%
      {
         tempy := A_Index + starty
         PixelGetColor, OutputVar, %tempx%, %tempy% , RGB
         Outputvar := "0x" . substr( Outputvar, -1 )
         setformat, integer, decimal
         Outputvar += 0
         if ( (Outputvar >= minblue) AND (Outputvar <= maxblue) )
         {
            matchx += tempx
            matchy += tempy
            match ++
            ToolTip, Match %tempx% %tempy%
         }
      }
      
   }
        ToolTip
   matchx := matchx / match
   matchy := matchy / match
   return match
}   

Er ist nicht so schnell, wie ich gehofft hatte, aber auch nicht unbrauchbar langsam.
Eine hohe anzahl von Treffern macht die Funktion langsamer, bei Null Treffern ist sie ziemlich schnell. D.h. man kann sie noch optimieren.
Wenn man jetzt noch nur jedes 2. oder 5. Pixel prüft und den Suchbereich klein hält, könnte das schon ausreichen, um Bewegungen zu erkennen.
Nach oben
ChiLLed
Gast





BeitragVerfasst am: Do Mai 15, 2008 2:49 am    Titel: Antworten mit Zitat

Hmm da knickt mein PC ein..hab aber auch nochn 1ghz amd Thunderbird Wink .
Diese Methode muss schnell sein. Vergessen wir die Genauigkeit, ich versuche es mit einer Suche nach 0x0000E6 (230rot) und einer Variation von 25 also von 0x0000CD (205rot) bis 0x1919FF (25blau, 25grün, 255rot).

Wie mache ich jetzt einen Loop der mir bei jedem Durchlauf zwei neue Variablen herausgibt (und natürlich diese neuen Koordinaten für den nächsten Durchlauf benutzt)? (x1,y1; x2,y2; ....)
Nach oben
BoBo²
Gast





BeitragVerfasst am: Do Mai 15, 2008 9:43 am    Titel: Antworten mit Zitat

Sorry, wie bekannt sind die Geschmäcker ja verschieden - auf deine Anfrage bezogen, welchen zwingenden Argumente a)b)c)... sprechen für die von dir preferierte Vorgehensweise?

Ausserdem fehlt mir immer noch 'das Gesamtbild'. Handelt es sich beim dynamischen Objekt um einen Graphen? Das potentielle Opfer in einem Game?? Mit welcher Geschwindigkeit bewegt sich denn das Objekt (ich rechne ungern erfolglos 'hinterher', ergo ne Gabel für die Suppe vorzuschlagen wär irgendwie uncool, oder)??

(M)ein Test. Bildschirm wird von Links nach Rechts, mit einem einspaltigen PixelSearch über die gesamte Bildschirmhöhe, abgescannt.

Zum Testen habe ich die AHK Hilfeseite zu Progress/SplashImage aus der AHK-Hilfe genommen. Dort werden die 'Object Colors' in kleinen Kästchen angezeigt. Da die Seite 'Überlänge' hat, lässt sie sich mit Scrollbalken verschieben, das Kästchen/Objekt ist also potentiell dynamisch. Bei einer Suche nach Purple (0x800080) werden die Farbigen Pixel des Kästchens auch in Bewegung einwandfrei ermittelt.
Die Anzeige der Position erfolgt an Bildschirmposition 10/10. Diese flakert deshalb, da auf der Scanlinie eine Reihe 'pinke'-Punkte liegen, ergo hier nur der zuletzt Ermittelte wirklich wahrnehmbar ist. Der Update der Werte erfolgt einfach zu schnell aufeinander. In eine Textdatei umgeleitet lässt sich dies leicht nachvollziehen.

Vorteil PixelSearch gegenüber PixelGetColor ist sicher der definierte Suchbereich, und die Option für Farbvariationen.

Code:
#Persistent
SetTimer, MovingObjectDetection, 1
Return

MovingObjectDetection:
Loop, %A_ScreenWidth%
{
  PixelSearch, OutputVarX, OutputVarY, %A_Index%, 0, % A_Index+1, %A_ScreenHeight%, 0x800080 , 10, Fast RGB
  If InStr(ErrorLevel,0)
     ToolTip % OutputVarX ":" OutputVarY, 10, 10
  }
ToolTip 
Return

!y::SetTimer, MovingObjectDetection, Off
!x::SetTimer, MovingObjectDetection, On
Nach oben
BoBo²
Gast





BeitragVerfasst am: Do Mai 15, 2008 2:58 pm    Titel: Antworten mit Zitat

HessenPower proudly presents: der Wackelpunkt (Götterspeise Eins Dot Null). Das perfekte Opfer!!

Code:
#Persistent
SetTimer, MovingGUI, 50

MouseGetPos, MPosX, MPosY ; 'Punkt' an Mausposition platzieren
XPos := MPosX
YPos := MPosY

Gui, +LastFound -Caption +ToolWindow
Gui, Color, 800080
Return

MovingGUI:
  Random, XOperator, 1, 2
  Random, YOperator, 1, 2
  If (XOperator = 1) OR InStr(XPos,"-")
    XPos += 1
  Else
    XPos -= 1
  If (YOperator = 1) OR InStr(YPos,"-")
    YPos += 1
  Else
    YPos -= 1
  ToolTip % XPos ":" YPos
  Gui, Show, w4 h4 x%XPos% y%YPos%, IchBinEinWackelPunkt (IBEWP)
  Return

!y::SetTimer, MovingGUI, On ; genug gerüttelt!
!x::SetTimer, MovingGUI, Off ; shake'm baby!
Ternär hab ich den if-clause nicht hinbekommen Mad
Nach oben
BoBo²
Gast





BeitragVerfasst am: Do Mai 15, 2008 3:13 pm    Titel: Antworten mit Zitat

Glaube mich zu erinnern das AHK-Geeks mit DllCall() eine Zeichenfunktion für den Desktop zurechtgefrickelt haben. Sollte sich zum dynamischen Bewegen von 'Desktop-Suchopfern' ebenfalls eignen.

Btw. Das Herumwackeln bem Wackel-Punkt ließe sich sicher über einen verlangsamten 'Operator'-Wechsel 'einsmoothen'.
Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe! Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de