Beerpong:Bechererkennung und Ausgabe

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Ziel des Projektes

Für den Spielablauf werden die bekannten Regeln genutzt:

10 Becher

2 Würfe, dann Wechseln

Wird ein Becher getroffen, so muss man ihn austrinken

Ob ein Becher getroffen wurde, sollte mit einer Kamera senkrecht über den gegnerischen Bechern ermittelt werden.

Zusätzlich wollten wir mit einer seitlichen Kamera den Wurf des Spielers erfassen und auswerten. Dieser Ansatz wurde im Laufe des Projekts zurückgestellt und es wurde nur noch die erste Variante zur Ermittlung genutzt.

Anschließend sollten die Daten ausgewertet und dem anderen Spieler über ein Serverapplikation dargestellt werden. Durch eine Animation wird angezeigt, welcher der zehn Becher getroffen wurde und dieser verschwindet dann vom virtuellen Tisch. Sollte kein Ball während der zwei Würfe in einem Becher landen, so können die Fehlwürfe per Mausklick bestätigt werden und der Gegner ist am Zug.

Umsetzung

Da wir zu sechst an diesem Projekt gearbeitet haben, haben wir die Arbeitspakete Eingabe/ Verarbeitung und Ausgabe in 2 kleinere Gruppen eingeteilt.

Eingabe & Verarbeitung

Die Eingabe des Beerpongspiels soll über eine Liveaufnahme oder eine bestehende Videodatei möglich sein. Eine Aufnahme umfasst eine Seite des Spielfelds mit zehn Bechern. Das Ergebnis der Verarbeitung sollen somit die Zustände der Becher sein. Es soll erkannt werden, ob ein Becher vorhanden, getroffen oder bereits weggenommen ist. Eine Erkennung eines "Abprallers" ist nicht möglich, da nur die statischen Bilder analysiert werden.

Die Verarbeitung erfolgt mittels OpenCV.

Die folgende Beschreibung bezieht sich auf den hier verlinkten Quellcode.

Die gezeigten Aufnahmen stammen aus einem selbst aufgenommenen Demonstrationsvideo.

Videoaufnahme

Die Aufzeichnung der Becher wurde mithilfe einer Handykamera umgesetzt. Bei der Aufnahme war darauf zu achten, dass ein einheitlicher Hintergrund gegeben ist und die Lichtquelle senkrecht über den Bechern ist. Erste Implementierungsversuche beinhalteten eine Hintergrundsubtraktion, bei der ein seitlicher Schattenwurf zu Problemen führte. Der Einfluss der Schatten konnte verkleinert werden, nachdem statt einer Hintergrundsubtraktion die Hough Transformation verwendet wurde.

Das Video wird über ein [VideoCapture] Objekt eingelesen.

Beerpong becher clean.png

Bechererkennung

Die Becher wurden mithilfe der OpenCV-Funktion [HoughCircles] erkannt. Die Parameter der Funktion sind abhängig vom Video und müssen vom Entwickler angepasst werden. Es passiert keine automatische Parametrierung.

Vor der Hough-Transformation muss das Farbbild in ein Grauwertbild umgewandelt werden. Es sei angemerkt, dass in OpenCV Farbvideos standardmäßig als BGR Bilder eingelesen werden.

Beerpong becher hough.png

Ballerkennung

Die Ballerkennung wurde im HSV-Farbraum umgesetzt. Zuerst musste der Farbwertes des Balles aus dem Video ausgelesen werden. Dafür wurde der Farbwert nach Mausklick auf das gewünschte Pixel ausgegeben. Hierfür wurde die [setMouseCallback] Funktion genutzt.

Nachdem ein passendes Spektrum ermittelt wurde, konnte das Farbbild mit der [inRange] Funktion in ein Binärbild umgewandelt werden.

Aus dem Binärbild wurden folgend die Momente berechnet, wodurch die Bestimmung des Schwerpunktes (und somit der Position) des Balles möglich war.

Beerpong ball binarisierung.png

Erkennung der Becherzustände

Aus der Bechererkennung können bis zu zehn dreidimensionale Vektoren hervorgehen. Diese beinhalten Mittelpunkt und Radius der jeweiligen Becher. Aus der Ballerkennung erhält man entweder die Position des Balles (zweidimensional) oder keinen Wert (bei Abwesenheit des Balles).

Für die Erkennung der Becherzustände war es nötig, ein Referenzbild zur Laufzeit zu speichern, das alle Becher beinhaltet. Darauf aufbauend konnten die Becher mit eindeutigen Indizes versehen werden und durch die Auswertung der Ergebnisse der Becher- und Ballerkennung der jeweilige Zustand ermittelt werden. Zur Veranschaulichung wurde jedem der drei Becherzustände ein Farbwert zugewiesen.

Beerpong erkennung 1.png

Beerpong erkennung 2.png

Fazit

Die Houghtransformation und die Farberkennung haben sich als sinnvolle Hilfsmittel erwiesen. Zum Ende des Praktikums wurde das Ziel erreicht, jedem Becher einen Zustand zu geben, der für weitere Verarbeitungen nützlich sein kann. Eine Implementierung eines Sockets für die OSC Kommunikation konnte aufgrund begrenzter Zeit nicht realisiert werden.

Ausgabe

Die Ausgabe der getroffenen Becher wurde mit einer virtuellen Version des Spiel Beerpong realisiert. Das Spiel wurde über eine Webapplikation realisiert, damit ein einfacher Zugang gewährleistet ist und für das Spiel keine zusätzliche Software benötigt wird. Es wurde das Client-Server Modell für die Implementation gewählt, um die Hardwareanforderungen möglichst niedrig zu halten und das Spiel von einem zentralen Punkt zu steuern.

Die dazu gehörige Spielelogik basiert auf dem Tic-Tac-Toe Spiel aus dem Buch Multiplayer Game Development with HTML5.

Der aktuelle Quellcode ist unter Quellcode oder unter Git Repository mit Nutzungsanweisung zu finden.

Da Beerpong, wie Tic-Tac-Toe ein rundenbasiertes Spiel ist, konnte viel der Spielemechanik übernommen und die Logik auf Beerpong angepasst werden.

Das Spiel

Zur Beschreibung der Webseite wurde HTML5 und CSS verwendet.

Beerpong website.PNG

JavaScript wurde für die Implementation der Spielelogik verwendet.

Das Spiel kommuniziert über eine network-socket. Der WebSocket stellt den Client dar und ist das Interface zwischen einem Spieler und dem Spiel. Er nimmt Spielerinteraktionen auf, übergibt sie an den Server und rendert das Spiel. Der WebSocketServer ist der Spieleserver und kümmert sich um die Verbindung zwischen den Spielern. Jeder Client übergibt die Informationen über das Spiel an den Server. Der Server updatet dann den Spielestatus und sendet die Informationen wieder zurück an die Clients.

Benötigte Hardware

Man benötigt einen Server, der das Spiel hostet. Dies kann ein einfacher Computer sein, der zwei Kommandozeilen-Fenster offen hat.

In der einen Kommandozeile starte man den Socket-Server und in der anderen den Web-Socket. Dadurch ist das Spiel über die jeweilige IP-Adresse und dem Port 3000 von jedem PC im Netzwerk erreichbar.

Beerpong socketserver.PNG

Beerpong webserver.PNG

Software

Jedoch ist die Spielelogik noch nicht vollständig implementiert.

Der derzeitige Stand des Spiels:

- Die Oberfläche der Webseite ist komplett, es befindet sich ein Bierzelttisch mit 10 Becher darauf. Es gibt ein Scoreboard zur Darstellung der beiden Spieler. Derjenige, der den nächsten Wurf tätigt, wird gehighlightet. - Die Kommunikation zwischen dem Socket-Server und Web-Socket funktioniert.

- Das Spiel hat nur ein Spielfeld implementiert, dass heißt, beide Spieler werfen auf die selben Becher.

- Die Gewinnlogik ist für ein Spielfeld vorhanden.

- Das Spiel kann nur durch neu laden der Seite erneut gestartet werden.


TODO:

- Implementation eines zweiten Spielfeldes, damit zwei Spieler gegeneinander statt miteinander spielen können, sowie die Option von Fehlwürfen.

- Eine Multi-Session Implementierung damit mehr als ein Spiel gleichzeitig stattfinden kann.

Verbesserungsmöglichkeiten