|
Funktion
Dieses Filter ist das Herzstück von AutoGamer, es soll
Spielfiguren in 3D-Szenerien erkennen. Es berücksichtigt
nicht die Gestalt einer Figur, da diese sich ja ständig
ändert (durch Gehen, Kämpfen, Bild-Zoom, Bild-Rotation). Zur
Objekterkennung wird stattdessen die Farbzusammensetzung
analysiert. Der Catalog muss die Farbrelevanzen und das
Farbhistogramm für alle Figuren berechnet haben.
Die Abtastung des Bildes erfolgt blockweise, für jeden
Pixelblock wird die am besten passende Figur gefunden.Es wird
ein Farbhistogramm der Pixel im Block berechnet, und mit den
Farbhistogrammen der Figuren im Catalog verglichen.
Farben aus dem Hintergrund werden erkannt und nicht dem
Farbhistogramm der Figur zugeordnet. Dazu müssen 1.
Bilder des Hintergrunds im Catalog eingetragen und mit
“Group=Background” markiert sein. 2. Der Hintergrund im
Block aus Flächen gleicher Palettenfarben bestehen, die
grösser sind als die grösste Zone von Hintergrundsfarben im
GameObject.
Display:
Es wird das Ausgangbild angezeigt, die erkannten Figuren
sind durch farbige und numerierte Rechtecke markiert. Die
Markerfarbe wurde vom Catalog automatisch berechnet.
Parameters:
BlockSize
|
Info:
|
Kantenlänge der Pixelblöcke Sollte so eingestellt
werden, dass eine Figur ungefähr in einen Block
passt. Wenn zu gross, erscheinen mehrere Figuren in
einem Block, und der Mustererkenner arbeitet mit der
Summe der Histogramme beider Figuren -> Fehler!
Wenn zu klein, wird eine Figur durch die Blöcke in
mehrere Segmente zerschnitten. Dann wird sie entweder
als mehrere Figuren detektiert, oder die Segmente
liefern nicht genug Pixel und sie wird gar nicht
erkannt.
|
Datentyp:
|
integer
|
Default:
|
keiner.
|
Beispiel:
|
“30” -> das Bild wird in Pixelquadrate von 30*30 Pixeln aufgeteilt.
|
Oversampling
|
Info:
|
Einstellung, wie oft das Bild mit der Blockstruktur
abgetastet wird. Damit Figuren durch Blockgrenzen
nicht bis zur Unkenntlichkeit zerteilt werden, kann
das Bild mehrfach mit einem jeweils verschobenen
Blockraster abgetastet werden. Erlaub sind 3 Muster:
OverSampling = 1, 2 und 4.
Bei Mehrfachabtastung (2 oder 4) sollte “Merge” gesetzt sein, sonst wird dasselbe Gameobjekte sehr oft als verschieden detektiert.
|
Datentyp:
|
1, 2 oder 4.
|
Default:
|
1
|
Beispiel:
|
2: Das Bild wird mit 2 gegeneinander verschobenen
Raster mit Maschenbreite “BlockSize*Blocksize”
abgetastet.
|
GameObjectList
|
Info:
|
Liste von GameObject-Namen, die erkannt werden
sollen. Wenn leer, werden alle GameObejcts mit
“Recognize=1” erkannt. Das Script kann hier
angeben, was gerade erkannt werden soll. Der Sinn ist
einfach die Rechenzeit-Optimierung: je weniger
Objekte erkannt werden müssen, desto besser.
Achtung: wenn eine im Bild vorkommende Figur
ausgeschlossen wird, wird vielleicht stattdessen eine
ähnliche aussehende andere Figur erkannt. Die Logik
ist also nicht: “erkenne alle Figuren, aber zeige
nicht alle an”, sondern “suche nach der besten Figur
aus der Liste”.
|
Datentyp:
|
Comma separeted list of names Namen mit Spaces in “..” einschliessen.
|
Default:
|
leer -> alle Objekte im Catalog mit “Recognize=!” werden erkannt
|
Beispiel:
|
“mysterious old man”,drunken_dwarf,sandwich_lady,
...”, wenn dieses Filter die bekannten Random-events
aus RuneScape erkennen soll.
|
MinimalColorRating
|
Info:
|
Angabe über maximale Grad von “Verschiedenheit” beim
Vergleich des GAmeObject-Farb-Relevanz-Histogramms
mit dem aktuellen Bildblock..Synthetischer Wert ohne
anschauliche Bedeutung.
Je höher der Wert ist, des eher wird der Inhalt
eines Bildblocks als GO erkannt. Bei hohen Werte
werden mehr GOs detektiert, bei niedrigen Werten
weniger.
Der Wert muss je nach Anforderung des Spielskriptes eingestellt werden.
|
Datentyp:
|
double
|
Default:
|
Für RuneScape ca. 300. Mehr für lockere Beurteilung,
wenn z.B. ein GO in einer farblich leicht veränderten
Darstellung nicht mehr erkannt wird. Weniger, wenn
das GO mit anderen GOs oder dem Bildhintergrund
verwechselt wird.
|
Beispiel:
|
|
ObjectSizeTolerance
|
Info:
|
Angabe über erlaubte Grössen-Abweichungen von
gefundenen GameObjects. Die Soll-Grösse eines GO
in Pixeln
(“gopixelsize”) wird aus seiner Angabe “Size_Meter” und dem Szeneparameter “Resolution_PixelPerMeter” berechnet.
Die Ist-Grösse nach Mustererkennung
(“goimagepixels”) berechnet sich als die Summe der
farblich passenden Pixeln.
Damit eine GameObject detektiert wird, muss gelten:
gopixelsize * gopixelsize / ObjectSizeTolerance
< goimagepixels < gopixelsize *
gopixelsize * ObjectSizeTolerance.
Hat auch Einfluss auf die Erkennung lokaler
Hintergrundsfarben im Block: Es werden nur
Farbflächen als Hintergrund erkannt, die grösser als
ObjectSizeTolerance * <grösste Hintegrundsfläche
in GO> sind
|
Datentyp:
|
double, >= 1
|
Default:
|
2. Mehr, wenn kleine Objekte fälschlicherweise als
GOs gefunden werden. Kleiner, wenn dargestellte GOs
nicht erkannt werden. Weniger, wenn lokaler
Hintergrund schlecht erkannt wird. Weniger, wenn
Flächen aus texturiertem Hintergrund mit GameObjecten
verwechselt werden. Mehr, wenn zuviele Figuren
durch die Zerstückelung durch Blockgrenzen verloren
gehen (geteilte Figur ist kleinere Figur)
|
Beispiel:
|
|
Resolution_PixelPerMeter
|
Info:
|
Geschätzter Massstab der Bildansicht: Wieviele
Bildpixel ergeben einen Meter der “wirklichen” Welt?
Dient zur Beurteilung, wie gross GameObjects
dargestellt werden, deren “wirkliche” Grösse mit
dem Parameter “Size_Meter” angegeben wurde.
Bei perspektivischen 3D-Ansichten hängt dieser
Parameter stark vom gewählten Zoom-Faktor und der
Entfernung der Spielfiguren vom Betrachter ab. Bei
starker Perspektive kann mit
“Resolution_PixelPerMeter” kann grob die Z-Lage der
zu erkennenden Objekte eingestellt werden. Man kann
so zB die Erkennung weitentfernter (= optisch
kleiner) Spielfiguren abschalten.
|
Datentyp:
|
double
|
Default:
|
Am besten ein bekanntes GameObject im Bild finden
und dessen Grösse in Pixel feststellen. Wert =
Wurzel(Länge*Breite)
|
Beispiel:
|
|
Merge
|
Info:
|
Durch die Rasterung der Blockstruktur kommt es oft
vor, dass ein GameObject in zwei Segmente zerlegt
wird, die getrennt voneinander im Ergebnis auftauchen.
Wenn “Merge=True” ist, werden GameObjects, dern
Extents an einerderstossen oder einander überlappen,
zu einem GameObjekt verschmolzen. Dadurch wird die
Zahl der Gameobjects gesenkt..
Der nötige Grad an Überlappung hängt vom Parameter
“Oversampling” ab. bei 1 (kein Oversampling) müssen
die Extents einander berühren. Bei 2 und 4fach
Abtastung müssen die Extents um “BlockSize/4”
überlappen. So wird der Effekt gedämpft, das mehrere
dicht beieinander stehende GameObejcts als ein
riesiges Objekt detektiert werden.
|
Datentyp:
|
Boolean
|
Default:
|
false
|
Beispiel:
|
|
Results:
Parameter 1:
Datentyp:
Default:
Rechenzeitbedarf:
Die CPU-Last wächst ...
- linear mit der Anzahl der zu entdeckenden Figuren.
- linear mit der Anzahl der Blöcke
- linear mit der Grösse der Blöcke
Bugs:
Die Aufteilung in starre Pixelblöcke ist blöd,das Blockraster zerreisst die Figuren. Aber alle
anderen Verfarhen zum erkennen von zusammengehörigen Pixelwolken sind nicht schnell
lauffähig.
|