Kinect-Programmierung
Yvonne Mußmacher Mario Haustein
UNIX-Stammtisch der TU Chemnitz
29. Januar 2013
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 1 / 41
GliederungKinect – Programmierung
1. Einleitung
2. Funktionsweise
3. libfreenect
4. Tiefenbildlokalisierung
5. OpenNI
6. Gestenerkennung
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 2 / 41
Einleitung
AllgemeinWas ist die Kinect?
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 3 / 41
Einleitung
AllgemeinKinect?
I Steuereinheit XBox 360 (Microsoft)
I Multifunktionaler Sensor
I Geratelose Interaktion mit Spielekonsole moglich
I Außerhalb der XBox-Umgebung durch verschiedene Frameworks nutzbarI Kinect for Windows (Microsoft)I libfreenect (OpenKinect)I OpenNi Framework (OpenNi Organisation)
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 4 / 41
Einleitung
Technische Daten
Mikrofon-Array
IR-Laser
RGB-Kamera
IR-Kamera Motorisierte Montierung
Tiefenkamera 58,8 × 45,6, 640× 480, 30 HzArbeitsbereich [1,2 m, 3,5 m]1
[50 cm, 8 m]2
Auflosung 1 mmFarbkamera 62,0 × 48,6, 640× 480, 30 Hz
1laut Hersteller2eigene Versuche
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 5 / 41
Einleitung
Technische Daten
Mikrofon-Array
IR-Laser
RGB-Kamera
IR-Kamera Motorisierte Montierung
Tiefenkamera 58,8 × 45,6, 640× 480, 30 HzArbeitsbereich [1,2 m, 3,5 m]1
[50 cm, 8 m]2
Auflosung 1 mmFarbkamera 62,0 × 48,6, 640× 480, 30 Hz
1laut Hersteller2eigene Versuche
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 5 / 41
Einleitung
ProjekteBeispiele
I Minority Report (Freenect) http://www.freenect.com/
I Sandkasten (UC Davis) http://www.geek.com/articles/geek-pick/
kinect-powered-augmented-reality-sandbox-2012059/
I Projektideen (OpenKinect)http://openkinect.org/wiki/Project_ideas
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 6 / 41
Funktionsweise
FunktionsweiseWie funktioniert’s?
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 7 / 41
Funktionsweise
Funktionsweise
Abbildung : RGB-Bild
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 8 / 41
Funktionsweise
Funktionsweise
Abbildung : Infrarot-Bild
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 8 / 41
Funktionsweise
Funktionsweise
Abbildung : Tiefenbild
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 8 / 41
Funktionsweise
Punktmuster
I Das Punktmuster ist wiederholungsfrei.
I Ein kleiner Ausschnitt . . .
I . . . lasst sich im Gesamtmuster eindeutig wiederfinden.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 9 / 41
Funktionsweise
Punktmuster
I Das Punktmuster ist wiederholungsfrei.
I Ein kleiner Ausschnitt . . .
I . . . lasst sich im Gesamtmuster eindeutig wiederfinden.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 9 / 41
Funktionsweise
Tiefenberechnung
I Die Lage des Musters hangt von der Tiefe der Projektionsflache ab.
Kamera Laser
p
d dref
sx
xref
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 10 / 41
Funktionsweise
Tiefenberechnung
I Die Lage des Musters hangt von der Tiefe der Projektionsflache ab.
Kamera Laser
p
d dref
sx
xref
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 10 / 41
Funktionsweise
Tiefenberechnung
I Die Lage des Musters hangt von der Tiefe der Projektionsflache ab.
Kamera Laser
p
d dref
sx
xref
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 10 / 41
Funktionsweise
Tiefenberechnung
I Die Lage des Musters hangt von der Tiefe der Projektionsflache ab.
Kamera Laser
p
d dref
sx
xref
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 10 / 41
Funktionsweise
Tiefenberechnung
I Die Lage des Musters hangt von der Tiefe der Projektionsflache ab.
Kamera Laser
p
d dref
sx
xref
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 10 / 41
Funktionsweise
Berechnung von d aus s
p
d dref
s
geg.: dref , p (bekannt)s (messbar)
ges.: d
Strahlensatz:
p
d=
s
d− dref⇐⇒ d =
p · drefs− p
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 11 / 41
Funktionsweise
Messung von s
I x und xref lassen sich in Pixelkoordinaten umrechnen.
=⇒ s = xref − x durch Pixel-Differenz berechenbar.
I Iref(X,Y ) . . . Bitmap des Punktmusters in Referenzentfernung.
I I(X,Y ) . . . Bitmap des Punktmusters der aktuellen Szene.
C(X,Y, S) =
Y+n∑η=Y−n
X+n∑ξ=X−n
I(ξ − S, η) · Iref(ξ, η)
I Suchen S, fur dass C(X,Y, S) maximal ist.
=⇒ S ist Pixelversatz an Koordinate (X,Y ).=⇒ n ist Große des Korrelationsfensters. I.d.R. einstellig ≥ 3.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 12 / 41
Funktionsweise
Genauigkeit
500 1,000 1,500 2,000 2,500 3,000 3,500 4,000 4,500 5,000
−50
0
50
d [mm]
[mm
]
Q90% −Q50%
Q10% −Q50%
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 13 / 41
libfreenect
ProgrammierenFreenect – Low Level API
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 14 / 41
libfreenect
Uber libfreenect
I Im Rahmen der OpenKinect-Community entstanden.I http://openkinect.org/wiki/Main_Page
I Ermoglicht Zugriff auf Low-Level Funktionen der Kamera.
I Grundlage bildet eine C-Bibliothek.
I Wrapper fur Python, C++, Actionscript, C#, Java JNI, Java JNA,Javascript, Common Lisp, . . .
I Dokumentation =⇒ libfreenect.h
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 15 / 41
libfreenect
Prinzip
1. Initialisierung der KameraI Aufbauen der USB-VerbindungI Registrieren von Callback-HandlernI Auswahl der Video-ModiI Starten der Streams (RGB-Bild und/oder Tiefenbild)
2. Aufruf der Eventhandler-Funktion
3. Event-Handler ruft Callback fur jeden empfangenen Frame auf.
4. Deinitialisierung
I Ansteuerung der LED’s bzw. Motoren erfolgt synchron.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 16 / 41
libfreenect
Die libfreenec-APIInitialisierung
#inc l u d e <libfreenect/libfreenect.h>
freenect_context *ctx;freenect_device *dev;freenect_frame_mode mode;
vo id cbfunc(freenect_device *dev , vo id *depth , uint32_t t)
i n t init()
freenect_init (&ctx , NULL);i f (freenect_num_devices(ctx) < 1)
r e t u r n -1;
freenect_select_subdevices(ctx , FREENECT_DEVICE_CAMERA);freenect_open_device(ctx , &dev , 0);freenect_set_depth_callback(dev , cbfunc);mode = freenect_find_depth_mode(FREENECT_RESOLUTION_MEDIUM ,
FREENECT_DEPTH_REGISTERED);freenect_set_depth_mode(dev , mode);freenect_start_depth(dev);
r e t u r n 0;
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 17 / 41
libfreenect
Die libfreenec-APIWeitere Initialisierungsfunktionen
I Fahigkeiten der Hardware auslesen.I int freenect_supported_subdevices(void)
I Gerat anhand Seriennummer offnen.I int freenect_open_device_by_camera_serial(freenect_context *ctx,
freenect_device **dev, const char* camera_serial)
I Eigenen Frame-Puffer festlegen.I int freenect_set_depth_buffer(freenect_device *dev, void *buf)
I Funktionen des RGB-DatenstromsI void freenect_set_video_callback(freenect_device *dev,
freenect_video_cb cb)I int freenect_set_video_buffer(freenect_device *dev, void *buf)I int freenect_start_video(freenect_device *dev)I int freenect_stop_video(freenect_device *dev)
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 18 / 41
libfreenect
Die libfreenec-APIModi der Tiefenkamera
I FREENECT_DEPTH_11BIT, FREENECT_DEPTH_10BITI Rohdaten. 16 Bit pro PixelI Wertebereich: 0, . . . , 2048I 2047 =⇒ Datenlucke
I FREENECT_DEPTH_11BIT_PACKED, FREENECT_DEPTH_10BIT_PACKEDI Rohdaten. Nur Signifikante Bits im Puffer.
I FREENECT_DEPTH_MMI Tiefenangabe in Millimeter.I Wertebereich: 50, . . . , 10000I 0 =⇒ Datenlucke
I FREENECT_DEPTH_REGISTEREDI Wie FREENECT_DEPTH_MM.I Tiefenbild wird auf RGB-Bild umprojiziert.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 19 / 41
libfreenect
Die libfreenec-APIHauptschleife
#inc l u d e <libfreenect/libfreenect.h>
freenect_context *ctx;i n t die = 0;
vo id mainloop ()
wh i l e (!die)freenect_process_events(ctx);
I Der Handler wird durch freenect process events() abearbeitet.
I freenect process events() kann auch zuruckkehren ohne irgendeinenHandler aufzurufen.
I Timeout-VarianteI int freenect_process_events_timeout(freenect_context *ctx,
struct timeval* timeout)
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 20 / 41
libfreenect
Die libfreenec-APIVerarbeitung der Frames
#inc l u d e <libfreenect/libfreenect.h>
freenect_frame_mode mode;
/* Modus: FREENECT_DEPTH_REGISTERED */s t a t i c vo id cbfunc(freenect_device *dev , vo id *depth , uint32_t t)
uns igned i n t x, y, offset;uint16_t dist;
printf("Zeitstempel: %12u:\n", t);
x = /* ... */;y = /* ... */;
offset = (y * mode.width + x) *(mode.data_bits_per_pixel + mode.padding_bits_per_pixel) / 8;
dist = *( uint16_t *)(depth + offset);
i f (dist)printf("Pixel (%u, %u) liegt %u mm vor der Kameraebene .\n", x, y, dist);
e l s eprintf("Distanz von Pixel (%u, %u) ist nicht bestimmbar .\n", x, y);
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 21 / 41
libfreenect
Die libfreenec-APIDeinitialisierung, weitere Features
#inc l u d e <libfreenect/libfreenect.h>
freenect_context *ctx;freenect_device *dev;freenect_frame_mode mode;
vo id deinit ()
freenect_stop_depth(dev);freenect_close_device(dev);freenect_shutdown(ctx);
I Weitere FeaturesI Zugriff auf Schwerkraftssensor (zur Bestimmung des Neigungswinkels)I Ansteuerung Motoren in der MontierungI Ansteuerung der LED an der Frontblende
I Siehe libfreenect.h
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 22 / 41
Tiefenbildlokalisierung
Objekt-LokalisierungPositionsbestimmung durch Tiefenbildanalyse
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 23 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 1. Objekterkennung
I Trennung der Objekte (Vordergrund) vom Hintergrund.
I Zunachst mangels besseren Wissens alles als Hintergrund betrachten.
I Hintergrundttiefe kann nur nach hinten korrigiert werden.
D
Dmin := min(D(−4), . . . , D(0)) B := max(B,Dmin)
Md := D + t(B) < B Mf := mfilter(Md)
D Tiefenbild
B Hintergrundtiefe
Md,Mf Objektmasken
t(·) Schwellwertfunktion
mfilter(·) Maskenfilter
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 24 / 41
Tiefenbildlokalisierung
ObjekterkennungSchwellwertfunktion
I Aus Genauigkeitsbetrachtung der Tiefendaten heraus:
t(x) = a · x2 + b · x+ c
I Empirisch ermittelt:
a = 150000 mm−1
b = 0
c = 5 mm
x [mm] 500 1000 2000 3000 4000 5000 6500 8000t(x) [mm] 7 12 31 65 112 172 287 432
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 26 / 41
Tiefenbildlokalisierung
ObjekterkennungMaskenfilter
I Pixel an Unstetigkeitsstellen weisen eine hohe Varianz auf.
=⇒ Werden auch im stationaren Zustand als Vordergrund erkannt.
I Filteroperationen
abtragen Pixel mit schwarzen Nachbarn werden schwarz.erweitern Pixel mit weißem Nachbarn werden weiß.
I Mf := mfilter(Md)
1. 1× abtragen Kanten loschen.2. 2× erweitern Lucken fullen.3. 2× abtragen Rand entfernen.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 27 / 41
Tiefenbildlokalisierung
MaskenfilterBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 28 / 41
Tiefenbildlokalisierung
MaskenfilterBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 28 / 41
Tiefenbildlokalisierung
Filter zur Objekttrennung
D
Mf
D′ := fill(D)
Om := Mf maskiert D′ C := contour(Om) C′ := ¬dilate(C)
Os := C′ maskiert Om
D′ Tiefenbild (Datenlucken erganzt)
Om Tiefenbild (Objekte evt. zusammenhangend)
C Objektkanten
C ′ Kantenmaske
Os Tiefenbild (Objekte getrennt)
fill(·) Datenlucken interpolieren
contour(·) Kantenerkennung
dilate(·) Maske erweitern
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 29 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 2. ObjekttrennungBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 30 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 2. ObjekttrennungBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 30 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 2. ObjekttrennungBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 30 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 2. ObjekttrennungBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 30 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 2. ObjekttrennungBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 30 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 2. ObjekttrennungBeispiel
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 30 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 3. Vektorisierung
1. Konturenerkennung fur die getrennte Objektmaske.
2. Vereinfachung der Konturenzuge.
3. Alle nicht geschlossenen Konturen loschen.
4. Alle Polygone unterhalb einer Mindestflache loschen.
=⇒ Letzte Rauschartefakte filtern.
5. Alle Polygone loschen, die innerhalb eines anderen Polygons liegen.
=⇒ Locher entfernen.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 31 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 4. Tracking
I Bisher nur Menge von Randpolygonen pro Frame.
=⇒ Korrelation notwendig.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 32 / 41
Tiefenbildlokalisierung
Tiefenbildauswertung – 4. Tracking
I Bisher nur Menge von Randpolygonen pro Frame.
=⇒ Korrelation notwendig.
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 32 / 41
Tiefenbildlokalisierung
Tracking – Ahnlichkeitsnorm
I Eigenschaften:I Nicht translationsinvariantI Nicht rotationsinvariantI Nicht skaleninvariant
I Je kleiner 〈C1, C2〉 um so ahnlicher sind C1 und C2.
I Naiver Ansatz (berucksichtigt nicht die Form eines Objekts):
〈C1, C2〉 =√
(x(C1)− x(C2))2 + (y(C1)− y(C2))2 +√|Ω(C1)− Ω(C2)|
C1, C2 Objektkonturen
x(C), y(C) Schwerpunkt von C
Ω(C) Raumwinkel von C
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 33 / 41
OpenNI
ProgrammierungOpenNi – High Level Programmierung?
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 34 / 41
OpenNI
Uber OpenNi
I Framework erlaubt Integration verschiedener Natural User Interfaces (NUI)
I Middelware fur Kinect Sensor (PrimeSense NITE)
I Neben C++, Java und C# mit PyOpenNi Wrapper fur Python
I Dokumentation und Information =⇒ http://www.openni.org
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 35 / 41
OpenNI
OpenNiPrinzip
I OpenNi Framework installierenI Aktuelle Version herunterladen =⇒ http://www.openni.org/openni-sdk/I Datei entpackenI Installer ausfuhren
I PyOpenNi InstallierenI Installationanleitung unter =⇒ https://github.com/jmendeth/PyOpenNII Installation mit ˜/PyOpenNI-build$ make abschließenI Kopiere ˜/PyOpenNI-build/lib/openni.so nach
˜/usr/local/lib/¡python version¿/dist-packages
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 36 / 41
Gestenerkennung
GestensteuerungWas ist moglich?
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 37 / 41
Gestenerkennung
DemonstrationGestenerkennung mit OpenNi – Die Idee
Kamerasteuerung am Videokonferenzsystem mit Hilfe der Kinect zur geratelosenInteraktion.
1. Personentracking
2. Interaktionsbereiche
3. Verwendung von Realweltkoordinaten
4. Einfache Gesten =⇒ einfache Funktionen
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 38 / 41
Gestenerkennung
Demonstration
Demo!
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 39 / 41
Gestenerkennung
Demonstration
I Skeletton eines Nutzers
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 40 / 41
Ende
Fragen?
Vielen Dank fur IhreAufmerksamkeit!
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 41 / 41
Ende
Fragen?
Vielen Dank fur IhreAufmerksamkeit!
Mußmacher, Haustein (UNIX-Stammtisch, TUC) Kinect-Programmierung 29. Januar 2013 41 / 41