Automatische Screenshots + Analyse des Bildes

CuriousBob

Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Mitglied
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

Bekanntes Mitglied
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

Mitglied
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 :).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H automatische Anzahl der Spalten ermitteln -> geht nicht AWT, Swing, JavaFX & SWT 6
J Swing Pane im SplitPane automatische Größe aktivieren AWT, Swing, JavaFX & SWT 0
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
I JAVAFX - CSS - automatische Property- und Methoden-Vorlagen in Eclipse AWT, Swing, JavaFX & SWT 17
Neumi5694 Swing Gridbaglayout - automatische Anpassung verhindern AWT, Swing, JavaFX & SWT 1
F Textfeld Währungszahlen und automatische Aktualisierung AWT, Swing, JavaFX & SWT 14
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
J ungewollt-automatische Größenänderung von JLabel AWT, Swing, JavaFX & SWT 5
S automatische Zeilenhöhen Anpassung bei JTable AWT, Swing, JavaFX & SWT 2
A Automatische anpassung im NullLayout AWT, Swing, JavaFX & SWT 10
N JEditorPane und automatische Scrollposition AWT, Swing, JavaFX & SWT 2
B Automatische Größenanpassung AWT, Swing, JavaFX & SWT 7
K Automatische Skalierung von GUI Elementen (Java Swing) AWT, Swing, JavaFX & SWT 2
N automatische Auswahl einer JComboBox AWT, Swing, JavaFX & SWT 6
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
aze GridLayout: Keine automatische Ausdehnung AWT, Swing, JavaFX & SWT 2
A AWT Automatische Weiterleitung? AWT, Swing, JavaFX & SWT 13
M Automatische Anpassung eines JPanels in einem JFrame AWT, Swing, JavaFX & SWT 6
L JTable automatische Spaltenbreite AWT, Swing, JavaFX & SWT 2
G JPanel automatische Größ AWT, Swing, JavaFX & SWT 4
C JSplitPane automatische Veränderung verbieten. AWT, Swing, JavaFX & SWT 3
T Automatische Grössenanpassung JPanel / JScrollpane AWT, Swing, JavaFX & SWT 3
G GridBagLayout - automatische Größenanpassung AWT, Swing, JavaFX & SWT 3
L jTextField mit automatische Suchfunktion? AWT, Swing, JavaFX & SWT 2
A Automatische Scrollbalken bei einem JFrame AWT, Swing, JavaFX & SWT 8
lumo AWT Screenshots machen ist langsam? AWT, Swing, JavaFX & SWT 6
A ArrayIndexOutOfBoundsException - analyse? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben