ColorByMovement

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

1. Grundidee: Ziel des Projekts ist es, in der Luft durch Handbewegungen eine Zeichnung erstellen zu können. Der Verlauf der Linien, die sich durch die Handbewegung ergeben, soll auf einem seperaten Bildschirm erkennbar sein. Das Projekt wird mit Hilfe einer Webcam realisiert, die die Bewegung erfasst und überträgt. Die Programmierung erfolgt auf Basis von C++ in Open Frameworks, ein Open-Source-Toolkit das vereinfachte Schnittstellen zu einer Vielzahl von leistungsstarken Softwarebibliotheken zur Medien- und Hardwaremanipulation sowie Kommunikation bietet. [1] Als mögliche Erweiterung wurde das Steuern vom Zeichenprogrammen durch Gesten in Betracht gezogen.

2. Ablauf:

Ablauf ColorByMovement.png

Die Handbewegung wird durch die Webcam aufgenommen und auf den PC übertragen. Der Datenabtausch erfolgt über Open Sound Control (OSC). Durch das nachrichtenbasierte Netzwerkprotokoll können Steuersignale von Hardware oder Software erzeugt und in Form von sogenannten OSC-Messages an eine Schnittstelle weitergegeben werden und damit eine Ausgabe steuern. [2].

3. Software

   3.1 Zeichenprogramm

Programmiert wird das ganze mit der class method namens ofPolyline, die es ermöglicht, mehrere Punkte zu einem einzigen Vektordatenobjekt zu kombinieren. Das Vektordatenobjekt kann auf dem Bildschirm gezeichnet, Punkt für Punkt manipuliert und mit anderen ofPolyline-Instanzen kombiniert werden.

Img 4.png

Die Punkte werden zu einer ofPolyline hinzugefügt, indem man sogenannte „Knoten“ hinzufügt. Standardmäßig sind diese Knoten vom Typ Vec3f.

Img 5.png

Der Datenabtausch erfolgt über OSC, wobei das Zeichenprogramm als Receiver funktioniert. Es wartet auf die Nachrichten die auf den definierten Port ankommen. Die letzte Nachricht wird gelöscht und mit der neuen Nachricht überschrieben. Zudem wird überprüft, um welche Nachricht es sich handelt. Wenn die Nachricht bekannt und diese eine Position ist, dann fügt er sie zur Line hinzu. Wenn die Nachricht bekannt und diese eine Farbe ist, dann wird die Farbe dementsprechend geändert. Im Programm wurden die Farben rot, grün und blau festgelegt. Der Datenabtausch erfolgt über OSC, wobei das Zeichenprogramm als Receiver funktioniert. Es wartet auf die Nachrichten die auf den definierten Port ankommen. Die letzte Nachricht wird gelöscht und mit der neuen Nachricht überschrieben. Danach wird überprüft um welche Nachricht es sich handelt:

- Wenn Nachricht bekannt und eine Position ist, dann fügt er diese der Line hinzu.
- Wenn Nachricht bekannt und eine Farbe ist, dann wird die Farbe dementsprechend geändert (in rot, grün oder blau).

Img 6.png

   3.2 Webcam-Programm

Zur Detektierung der Handbewegung wird mithilfe der Webcam ein Video in Echtzeit aufgenommen und nach einem Tastendruck der Leertaste verarbeitet. Das aktuelle Bild wird erst in ein Grauwert-Bild umgewandelt und anschließend das vorherige Grauwert-Bild abgezogen. Nun wird das Ergebnis binarisiert und „Opening“ durchgeführt, um Störungen und Rauschen zu entfernen. Zur Erkennung der Handkontur wird ofxCvContourFinder verwendet mit einer Mindestgröße von 10pts. Löcher sind mit enthalten und werden anschließend manuell herausgefiltert, jedoch hätten diese auch direkt beim Kontur-Finde-Algorithmus ignoriert werden können. Aus den gefundenen Bewegungskonturen wird die höchste übrig gebliebene Kontur als Handbewegung genutzt. Aus diesem Blob werden nun die höchsten Koordinaten per OSC an das Zeichenprogramm gesendet. Folgende Befehle werden dafür benutzt:

Img 1.jpeg

Außerdem kann auch die Farbe der gezeichneten Linien per OSC übertragen werden mit folgenden Befehlen:

Img 2.jpeg

Bilder der Programme:

Zeichenprogramm:

Bildschirmfoto 2019-07-19 um 12.13.52.png

Webcamprogramm:

Bildschirmfoto 2019-07-19 um 12.16.13.png

Programmcode: Webcam-Programm main.cpp

Webcam-Programm ofApp.cpp

Webcam-Programm ofApp.h

Webcam-Programm main.cpp

Webcam-Programm ofApp.cpp

Webcam-Programm ofApp.h


Quellen: [1] https://de.wikipedia.org/wiki/OpenFrameworks

[2] https://de.wikipedia.org/wiki/Open_Sound_Control