Objektbasierte klangerzeugung

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Zielsetzung des Projekts ist es, Objekte mit einer Kamera aufzunehmen, von den Objekten Merkmale zu extrahieren und auf Grundlage dieser Klänge zu erzeugen.




Der Aufbau

Bild des Aufbaus

Ablauf

1. Aufnahme eines Bildes über eine Kamera (bei uns über den openFramework Video-Grabber)

2. Hintergrundsubtraktion (Hintergrund kann durch Drücken der Taste 'H' neu aufgenommen werden)

3. Binarisierung mit einer Schwelle

4. Finden der Objekte/Konturen (mit openCV Kontur-Finder)

5. Extraktion von Merkmalen (Maxima der Außenkontur)

6. Berechnung der Klänge für jedes Objekt und überlagern dieser (openFramework Sound-Buffer)


Merkmalsextraktion

Zuerst wird der Schwerpunkt des Objekts berechnet. Dann wird zu jedem Punkt der Außenkontur die Entfernung und der Winkel zum Schwerpunkt berechnet. Nun werden die maximalen Entfernungen für jeden Winkel abgespeichert(siehe Kreis-Transformation). In dem erzeugten Außenprofil wird nach lokalen Maxima gesucht. Die Winkel dieser Maxima bestimmen die Ausgangsfrequenzen (0°-359° => 100Hz-10000Hz).

Finden der Außenkontur

Zum Finden der Außenkontur wird zuerst das Bild über den Video Grabber geladen, in ein Grauwert Bild umgewandelt und der Hintergrund abgezogen. Das Extrahieren der Objekte und ihrer Konturen erfolgt über die OpenCV Funktion "findContours".

Berechnen der maximalen Entfernung pro Winkel

Alle gefundenen Objekte werden nacheinander bearbeitet. Für jeden Punkt der Außenkontur wird sein Winkel zum Schwerpunkt des Objektes berechnet, sowie seine Entfernung zu diesem. Wenn die gefundene Entfernung für diesen Winkel die größte bisher gefundene ist, wird sie abgespeichert.

Finden der Lokalen Entfernung Maxima

Zum Finden der lokalen Maxima in der Außenkontur wird ein Fenster über die Außenkontur geschoben. Für jeden Winkel wird geprüft ob seine Entfernung zum Schwerpunkt des Objektes die Größte im gewählten Fenster ist.


Klangerzeugung

Zur Klangerzeugung berechnen wir ein diskretes Tonsignal, welches über den openFramework Sound-Buffer ausgegeben wird, was bedeutet dass jeder Punkt berechnet werden muss. Da jeder Punkt aus einer Überlagerung von beliebig vielen Sinusschwingungen entsteht, würde das einen hohen Rechenaufwand bedeuten würde. Um diesen zu verringern wird einmal eine Look-Up Table berechnet, aus welcher alle künftigen Sinus-Werte ausgelesen werden. Die Frequenzen der Sinusschwingungen werden zusammen addiert.


Erzeugung der Klänge

Es werden alle gefunden Frequenzen in allen Objekten abgearbeitet. Für jede Frequenz wird das diskrete Ausgangssignal berechnet und von allen Frequenzen übereinander gelegt. Anschließend wird noch durch die Anzahl aller enthaltenen Frequenzen geteilt, damit kein zu großes Signal für die Lautsprecher entsteht (sonst kommt es zu Verzerrungen).


Fazit

Trotz Verwendung von nur einem Merkmal, ergeben sich trotzdem interessante Klänge. Dies liegt unter anderem an Ungenauigkeit der Kamera, Schattenwürfe, Rauschen usw.. So gab es zwischenzeitlich eine Version die Geräusche erzeugte, die sehr an den alten Sound von Pokemon erinnern. (Diese Version lässt sich mit der Taste 'P' aktivieren)


Link

Aufbau

Finden der Außenkontur

Berechnen der maximalen Entfernung pro Winkel

Finden der Lokalen Entfernung Maxima

Erzeugung der Klänge


Projekt