Skeltrack: A Free Software library for skeleton tracking (LinuxTag 2012)

Post on 17-May-2015

816 views 1 download

Tags:

description

By Joaquim Rocha. With the release of the Kinect device, there was finally an affordable camera capable of giving depth information. This, together with the Kinect's open USB connection, led to a lot of innovative projects. Still, the Kinect just gives raw signals and the only way to obtain more complex information, such as skeleton tracking was to use either the Microsoft SDK or the OpenNI framework. Both of these solutions are closed, proprietary and, in the case of Microsoft's, only for non-commercial work. To solve the issue above, Igalia developed Skeltrack, a Free and Open Source library published under LGPL that performs human skeleton tracking and identifies a number of skeleton joints. It is a more atomic solution than the other commercial counterparts because it does not connect directly to the Kinect nor to any other depth camera, instead it expects to be given the buffer corresponding to the depth buffer. In this talk I will present how Skeltrack was developed and show a demo of it working.

Transcript of Skeltrack: A Free Software library for skeleton tracking (LinuxTag 2012)

Skeltrack - Open Source Skeleton Tracking

Joaquim Rocha, IgaliaLinuxTag 2012 - Wunderbare Berlin

Guten Tag!

✩ I am a developer at Igalia✩ I like doing innovative stuff like OCRFeeder and SeriesFinale✩ and today I am presenting my latest project: Skeltrack

The Kinect

Microsoft's Kinect was the first camerawith a price affordable to the public

The USB connection is open and thus hackable

This originated Open Source projects like the libfreenect,a library to control the Kinect device and get its information

We created a GLib wrapper for libfreenect called GFreenect

GFreenect offers asynchronous functions (and some synchronous aswell) and makes it easy to use with other GNOME technologies

GObject Introspection = free bindings (Python, Javascript, Vala)

Kinect has a structured light camera which gives depth information

But that's raw information... values from 0-2048

libfreenect/GFreenect can give those values in mm

Still...

It does NOT tell you there is a person in the picture

Or a cow

Or an ampelmann

Let alone a skeleton and where its joints are

For this you need a skeleton tracking solution

Three proprietary/closed solutions exist:

Microsoft Kinect SDK: non-commercial only

OpenNI: commercial compatible

Kinect for Windows: commercial use allowedbut incompatible with the XBox's Kinect

Conclusion: There were no Free solutions toperform skeleton tracking... :(

So Igalia built one!

Enter Skeltrack

What we wanted:✩ A shared library, no fancy SDK✩ Device independent✩ No pattern matching, no databases✩ Easy to use (everybody wants that!)

Not as easy as it sounds!

After some investigation we found Andreas Baak'spaper "A Data-Driven Approach for Real-Time FullBody Pose Reconstruction from a Depth Camera"

However this paper uses a database ofposes to get what the user is doing

So we based only part of our work on it

How does it work?

First we need to find the extremas

Make a graph whose nodes are the depth pixels

Connect two nodes if the distance is less than acertain value

Connect the different graph's components by usingconnected-component labeling

Choose a starting point and calculate Dijkstra toeach point of the graph; choose the furthest point.There you got your extrema!

Then create an edge between the starting pointand the current extrema point with 0 cost andrepeat the same process now using the currentextrema as a starting point.

This comes from Baak's paper and the differencestarts here: choosing the starting point

Baak chooses a centroid as the starting point

We choose the bottom-most point starting from thecentroid (this showed better results for the upperbody extremas)

So we got ourselves some extremas!What to do with them?

What extrema is a hand, a head, a shoulder?

For that we use educated guesses...

We calculate 3 extremas

Then we check each of them hoping they are the head

How?

For each extrema we look for the points in placeswhere the shoulders should be, checking their distancesbetween the extrema and between each other.

If they obey those rules then we assume they arethe head'n'shoulders (tm)

With the remaining 2 extremas, we will try to see ifthey are elbows or hands

How to do it?

Calculate Dijkstra from the shoulders to each extrema

The closest extrema to any of the shoulders is either ahand of an elbow of that shoulder

How to check if it's a hand or an elbow?

If the distance between the extrema and the shoulder isless than a predefined value, then it is an elbow. Otherwiseit is a hand.

If it is a hand, we find the elbow by choosing the first point(in the path we created with Dijkstra before) whose distanceexceeds the elbow distance mentioned before

There is still some things missing...

Future work

Hands from elbows: If one of the extremas is an elbow, weneed to infer where the hand is

Smoothing: Smooth the jittering of the joints

Robustness: Use restrictions to ignore objects that are notthe user

Multi-user: Track more than one person at a time

And of course, get the rest of the joints: hips, knees, etc.

How to use it?

Asynchronous API

SkeltrackSkeleton *skeleton = SKELTRACK_SKELETON (skeltrack_skeleton_new ());skeltrack_skeleton_track_joints (skeleton, depth_buffer, buffer_width, buffer_height, NULL, on_track_joints, NULL);

Synchronous API

SkeltrackJointList list;list = skeltrack_skeleton_track_joints_sync (skeleton, depth_buffer, buffer_width, buffer_height, NULL, NULL);

Skeleton Joint:

ID: HEAD, LEFT_ELBOW, RIGHT_HAND, ...x: X coordinate in real world (in mm)y: Y coordinate in real world (in mm)screen_x: X coordinate in the screen (in pixels)screen_y: Y coordinate in the screen (in pixels)

Code/Bugs: https://github.com/joaquimrocha/Skeltrack

Nifty Tools for Development:

GFreenect: https://github.com/elima/GFreenect

GFreenect Utils: https://github.com/joaquimrocha/gfreenect-utils

GFreenect Python Example

Tool: record-depth-file

Tool: depth-file-viewer

Questions?

Creative Commons pictures from flickr:Kinect: Auxo.co.krAmpelmann: echiner1Kid Playing: Rob WelshSkeleton: Dark Botxy