Skeltrack - Open Source Skeleton Tracking
Joaquim Rocha, Igalia
LinuxTag 2012 - Wunderbare Berlin
Guten Tag!
✩ I am a developer at Igalia
✩ I like doing innovative stuff like OCRFeeder and SeriesFinale
✩ and today I am pr...
The Kinect
Microsoft's Kinect was the first camera
with 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 as
well) and makes it easy to use with other GNOME technologi...
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 allowed
but incompatible with the XBox's Kinect
Conclusion: There were no Free solutions to
perform 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 (e...
Not as easy as it sounds!
After some investigation we found Andreas Baak's
paper "A Data-Driven Approach for Real-Time Full
Body Pose Reconstruction...
However this paper uses a database of
poses 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 a
certain value
Connect the different graph's components by using
connected-component labeling
Choose a starting point and calculate Dijkstra to
each point of the graph; choose the furthest point.
There you got your e...
Then create an edge between the starting point
and the current extrema point with 0 cost and
repeat the same process now u...
This comes from Baak's paper and the difference
starts here: choosing the starting point
Baak chooses a centroid as the starting point
We choose the bottom-most point starting from the
centroid (this showed bett...
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 places
where the shoulders should be, checking their distances
between the extr...
If they obey those rules then we assume they are
the head'n'shoulders (tm)
With the remaining 2 extremas, we will try to see if
they 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 a
hand 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 is
less than a predefined value, then it is an elbow. Otherwise
it is ...
If it is a hand, we find the elbow by choosing the first point
(in the path we created with Dijkstra before) whose distance
...
There is still some things missing...
Future work
Hands from elbows: If one of the extremas is an elbow, we
need to infer where the hand is
Smoothing: Smooth the jittering of the joints
Robustness: Use restrictions to ignore objects that are not
the 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,
d...
Synchronous API
SkeltrackJointList list;
list = skeltrack_skeleton_track_joints_sync (skeleton,
depth_buffer,
buffer_width,
buffer_height,...
Skeleton Joint:
ID: HEAD, LEFT_ELBOW, RIGHT_HAND, ...
x: X coordinate in real world (in mm)
y: Y coordinate in real world ...
Code/Bugs:
https://github.com/joaquimrocha/Skeltrack
Nifty Tools for Development:
GFreenect:
https://github.com/elima/GFreenect
GFreenect Utils:
https://github.com/joaquimroch...
GFreenect Python Example
Tool: record-depth-file
Tool: depth-file-viewer
Questions?
Creative Commons pictures from flickr:
Kinect: Auxo.co.kr
Ampelmann: echiner1
Kid Playing: Rob Welsh
Skeleton: Dark Botxy
Skeltrack: A Free Software library for skeleton tracking (LinuxTag 2012)
Skeltrack: A Free Software library for skeleton tracking (LinuxTag 2012)
Skeltrack: A Free Software library for skeleton tracking (LinuxTag 2012)
Skeltrack: A Free Software library for skeleton tracking (LinuxTag 2012)
Upcoming SlideShare
Loading in...5
×

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

1,074

Published on

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.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,074
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
17
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Skeltrack - Open Source Skeleton Tracking Joaquim Rocha, Igalia LinuxTag 2012 - Wunderbare Berlin
  2. 2. 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
  3. 3. The Kinect
  4. 4. Microsoft's Kinect was the first camera with a price affordable to the public
  5. 5. The USB connection is open and thus hackable
  6. 6. This originated Open Source projects like the libfreenect, a library to control the Kinect device and get its information
  7. 7. We created a GLib wrapper for libfreenect called GFreenect
  8. 8. GFreenect offers asynchronous functions (and some synchronous as well) and makes it easy to use with other GNOME technologies
  9. 9. GObject Introspection = free bindings (Python, Javascript, Vala)
  10. 10. Kinect has a structured light camera which gives depth information
  11. 11. But that's raw information... values from 0-2048
  12. 12. libfreenect/GFreenect can give those values in mm
  13. 13. Still...
  14. 14. It does NOT tell you there is a person in the picture
  15. 15. Or a cow
  16. 16. Or an ampelmann
  17. 17. Let alone a skeleton and where its joints are
  18. 18. For this you need a skeleton tracking solution
  19. 19. Three proprietary/closed solutions exist:
  20. 20. Microsoft Kinect SDK: non-commercial only
  21. 21. OpenNI: commercial compatible
  22. 22. Kinect for Windows: commercial use allowed but incompatible with the XBox's Kinect
  23. 23. Conclusion: There were no Free solutions to perform skeleton tracking... :(
  24. 24. So Igalia built one!
  25. 25. Enter Skeltrack
  26. 26. What we wanted: ✩ A shared library, no fancy SDK ✩ Device independent ✩ No pattern matching, no databases ✩ Easy to use (everybody wants that!)
  27. 27. Not as easy as it sounds!
  28. 28. After some investigation we found Andreas Baak's paper "A Data-Driven Approach for Real-Time Full Body Pose Reconstruction from a Depth Camera"
  29. 29. However this paper uses a database of poses to get what the user is doing
  30. 30. So we based only part of our work on it
  31. 31. How does it work?
  32. 32. First we need to find the extremas
  33. 33. Make a graph whose nodes are the depth pixels
  34. 34. Connect two nodes if the distance is less than a certain value
  35. 35. Connect the different graph's components by using connected-component labeling
  36. 36. Choose a starting point and calculate Dijkstra to each point of the graph; choose the furthest point. There you got your extrema!
  37. 37. Then create an edge between the starting point and the current extrema point with 0 cost and repeat the same process now using the current extrema as a starting point.
  38. 38. This comes from Baak's paper and the difference starts here: choosing the starting point
  39. 39. Baak chooses a centroid as the starting point We choose the bottom-most point starting from the centroid (this showed better results for the upper body extremas)
  40. 40. So we got ourselves some extremas! What to do with them?
  41. 41. What extrema is a hand, a head, a shoulder?
  42. 42. For that we use educated guesses...
  43. 43. We calculate 3 extremas
  44. 44. Then we check each of them hoping they are the head
  45. 45. How?
  46. 46. For each extrema we look for the points in places where the shoulders should be, checking their distances between the extrema and between each other.
  47. 47. If they obey those rules then we assume they are the head'n'shoulders (tm)
  48. 48. With the remaining 2 extremas, we will try to see if they are elbows or hands
  49. 49. How to do it?
  50. 50. Calculate Dijkstra from the shoulders to each extrema
  51. 51. The closest extrema to any of the shoulders is either a hand of an elbow of that shoulder
  52. 52. How to check if it's a hand or an elbow?
  53. 53. If the distance between the extrema and the shoulder is less than a predefined value, then it is an elbow. Otherwise it is a hand.
  54. 54. If it is a hand, we find the elbow by choosing the first point (in the path we created with Dijkstra before) whose distance exceeds the elbow distance mentioned before
  55. 55. There is still some things missing...
  56. 56. Future work
  57. 57. Hands from elbows: If one of the extremas is an elbow, we need to infer where the hand is
  58. 58. Smoothing: Smooth the jittering of the joints
  59. 59. Robustness: Use restrictions to ignore objects that are not the user
  60. 60. Multi-user: Track more than one person at a time
  61. 61. And of course, get the rest of the joints: hips, knees, etc.
  62. 62. How to use it?
  63. 63. Asynchronous API
  64. 64. SkeltrackSkeleton *skeleton = SKELTRACK_SKELETON (skeltrack_skeleton_new ()); skeltrack_skeleton_track_joints (skeleton, depth_buffer, buffer_width, buffer_height, NULL, on_track_joints, NULL);
  65. 65. Synchronous API
  66. 66. SkeltrackJointList list; list = skeltrack_skeleton_track_joints_sync (skeleton, depth_buffer, buffer_width, buffer_height, NULL, NULL);
  67. 67. 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)
  68. 68. Code/Bugs: https://github.com/joaquimrocha/Skeltrack
  69. 69. Nifty Tools for Development: GFreenect: https://github.com/elima/GFreenect GFreenect Utils: https://github.com/joaquimrocha/gfreenect-utils
  70. 70. GFreenect Python Example
  71. 71. Tool: record-depth-file
  72. 72. Tool: depth-file-viewer
  73. 73. Questions?
  74. 74. Creative Commons pictures from flickr: Kinect: Auxo.co.kr Ampelmann: echiner1 Kid Playing: Rob Welsh Skeleton: Dark Botxy
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×