Automatisiertes Dartspiel (Erweiterung)

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Dieses Projekt wurde im Rahmen des Interaktionspraktikum SS2019 weitergeführt. Die Page der Vorgänger finden Sie | hier.


Stand des Projekts bei Übernahme

  • Bildentzerrung funktioniert bei fester Auflösung von 640x480 (bxh)
  • Programm läuft mit einzelnen Bildern (.jpg)
  • Hintergrundsubtraktion zeigt den gesamten Dartpfeil an

Geplante Features

  • Bildentzerrung funktioniert bei beliebiger Auflösung
  • Programm läuft in Echtzeit bei einem durch Webcam aufgezeichneten Stream
  • Puntezähler
    • Spitze des Pfeils bestimmen
    • Position auf der Dartscheibe bestimmen

Realisierung

Im großen und ganzen konnten wir viele Features umsetzen. Diese sollen im Folgenden erläutert werden, außerdem soll auf die Implementierung eingegangen werden.

Beliebige Auflösung

Das Erste gelöste Problem betrifft die Anzeige des Programms. Es ist gelungen, über zwei DEFINE "Variablen" einzustellen, mit welchem Format das Bild geladen und verarbeitet wird, die DEFINES LENGTH und HEIGHT übernehmen dabei die Skalierung. Sie wirken als ein Skalarer Multiplikator, beispielsweise um den Kreis für die Dartscheibe zu zeichnen (0.5 x HEIGHT -20) oder generell einfach die Bildgröße festzulegen.

Punktezähler

Pfeilspitzendetektion

Kamerabild
Erkannter Dart, Spitze markiert

Um die Pfeilspitze zu detektieren wird sich eines Tricks bedient. Die Dartscheibe muss in einem bestimmten Winkel gefilmt (fotografiert) werden (vgl. im Bild oben, wobei wichtig ist, dass die Kamera in Etwa von Feld zwei oder 15 auf die Scheibe gerichtet sein muss), sodass alle Dartpfeile so auftreffen, dass die Spitze immer der am weitesten rechts liegende Punkt im Bild ist. Dementsprechend wird also mithilfe einer Suchfunktion der Punkt, welcher aus der Subtraktion des Vorher/Nachher Vergleichs mit einem gewissen Offsets hervorgeht, als Spitze deklariert, markiert und weiterverarbeitet. Dies funktioniert je nach Kameraeinstellung und Wurfart der Dartpfeile in bis zu 100% der Fällen.


Positionsdetektion

Um den Ort auf der Dartscheibe herauszurechnen und somit Punkte zählen zu können bedienen wir uns dem Konzept der Polarkoordinate. Vom Ursprung aus - der Mitte des Bullseyes, oder auch der Mitte des eingezeichneten Kreises - besitzt jeder Punkt einen Abstand und einen Winkel. Da durch den Kreis festgelegt ist, wie der User die Schreibe ins Bild "einzulegen" hat, ist der Abstand für die Detektion des Feldes (Bullseye, Bull, Single, Triple, Single, Double, Miss) ein gewisser Definierter Pixelwert (in Relation zu den oben genannten Defines). Um die Punktzahl festzulegen ist eine Abfrage auf den Winkelwert der Polarkoordinate durchzuführen, sodass das Segment (1-20) bestimmt wird. Nun werden beide Ergebnisse multipliziert und angezeigt.

Webcam

Aufnahmeanordnung

Die Ausarbeitung mit Webcam-stream benötigte zu viel Zeit, wir konnten diese leider nicht abschließen. Die präsentierte Version läuft mit einem Video im Format .mov. Dieses wird pro Frame auf Unterschied zum vorherigen Frame gescannt, ist der Unterschied groß genug gewesen um ein Pfeil sein zu können, so wird gewartet bis der Unterschied vorbei ist (Pfeil hat Scheibe getroffen und wackelt nicht mehr) dann wird das Video angehalten und die Berechnung der Spitze beginnt. Weitergeschaltet wird das Video mit Tastendruck.


Nächste bzw. Abschließende Schritte

Um das Projekt komplett einsatzfähig machen zu können, müssten noch folgende Schritte unternommen werden:

  • Implementierung der Umsetzung mit Webcam-stream
  • Einbau eines "Zwei Spieler Modus"
  • evtl. Wurfrechner mit Vorschlagsfunktion um Kopfrechnen zu erleichtern


Programmcode:

Programmcode