# Automatische Screenshots + Analyse des Bildes



## CuriousBob (16. Jun 2011)

Hallo,
ich bin gerade am überlegen mir einen kleinen Bot für ein Spiel zu schreiben. Der Bot soll erkennen wenn etwas bestimmtes im Spiel passiert und dann einfach an eine bestimmte Stelle klicken. Das Programm ist nur als Übung gedacht und wird ausschließlich im Singleplayer verwendet. Ich habe also nicht vor mir einen unfairen Vorteil gegenüber anderen zu verschaffen oder gar gegen irgendwelche Endbenutzer-Lizenzverträge oder sonstiges zu verstoßen! 

Leider weiß ich aber absolut nicht wie ich da am besten vorgehen soll. Theoretisch müsste man wohl alle x (milli)sekunden Screenshots machen und es dann mit einem Soll-Bild vergleichen, aber wie setzt man das Ganze dann praktisch um? Mir ist bewusst, dass das sicherlich nicht mit einem einfachen Algorithmus getan ist und ich habe auch kein Problem mich erstmal lang und breit in das Thema einzulesen. Ich habe allerdings absolut keine Ahnung wo/wie ich da anfangen soll. Könnte mir jemand ein paar Seiten/Tutorials oder vielleicht sogar Beispielcodes empfehlen?


----------



## Marco13 (16. Jun 2011)

Screenshot mit java.awt.Robot. In dem Bild dann GENAU einen bestimmten Ausschnitt zu finden ist leicht, auch wenn man da für mehr performance ein bißchen mehr Überlegungen reinstecken kann. Einen Bildausschnitt zu "analysieren" im abstrakten Sinn ist das, wofür die ganzen Forschunseinrichtungen das viele Geld bekommen.


----------



## muckelzwerg (16. Jun 2011)

Digitale Bildverarbeitung ist Deine Wurzel. Segmentierung von Features, Filter wie Sobel, Hough ... Methoden wie Histogrammanalyse oder ConectedComponentLabeling ... Berechnungen für Homographien, Epipolarebenen, Bildkorrespondenzen ...
Partikelfilter für Bewegungen (Kalman, Bayes allgemein ...)
es gibt wirklich jede Menge zu lesen.
Einsteigeraufgaben sind Kantendetektion und "finde den roten Ball". 

Für anständige Geschwindigkeiten reichen Screenshots nicht aus. Einige Captureverfahren haben keinen Zugriff auf die 3D Darstellungen aus Spielen, andere lesen es mit readPixel() von der Graka zurück ... das ist selten schnell genug.
Eine relativ angenehme und schnelle Lösung ist, zwei Systeme zu verwenden. Eines auf dem das Spiel läuft (z.B. Spielekonsole) und eines, das den Output über eine Capture-Karte zugespielt bekommt und darauf die Bildanalyse macht.
In der billigen Variante kannst Du es auch mit einem Bildschirm und einen Kamera versuchen. Das geht durchaus und mit ein Bisschen Gebastel und Glück ist die Bildqualität auch gar nicht so schlecht.
Bei der Variante kannst Du allerdings solche "billigen Tricks" wie "teste ob PixelXY exakt die Farbe Z hat" vergessen.


----------



## CuriousBob (16. Jun 2011)

Vielen Dank für die Antworten. Da hab ich jetzt erstmal genug zum lesen .

Die Captureverfahren muss ich mir dann mal ausführlich anschauen. Zwei Systeme stehen leider nicht zur Verfügung. 
Das Captureverfahren das direkt von der Grafikkarte liest wird schätze ich mal über JNI + DLL laufen? Das klingt auf Anhieb mal am einfachsten. Der zu untersuchende Bereich ist ja auch "nur" ca. 200x200Pixel groß und eine Reaktion von ca. 2 Sekunden dürfte ausreichen. Mal schauen ob das zu bewerkstelligen ist.


----------



## muckelzwerg (17. Jun 2011)

Ja, das sollte gehen. Bei 200x200px@0.5Hz kannst Du auf einem aktuellen System auch von der Grafikkarte zurücklesen und hast noch Zeit für die Bildanalyse.


----------



## CuriousBob (18. Jun 2011)

Juhu es funktioniert. Ich habe es jetzt fürs erste über Brute-Force + Farbmustererkennung gelöst. Einen 40x40Pixel Würfel mit fest vorgegebenen Farb(bereichen) innerhalb eines 500x500Pixel Bereichs (war doch etwas größer) zu erkennen geht doch einfacher als ich dachte. Die Lösung ist zwar nicht besonders elegant, aber es funktioniert gut und schnell genug.

Digitale Bildverarbeitung ist wirklich sehr interessant. Die nächsten Wochen werden jetzt erstmal mit Büchern und wissenschaftlichen Arbeiten zu den oben aufgeführten Themen verbracht. Danke nochmal .


----------

