Terminator, Sky Biometry and the Kinect
Today's project is from someone new to the Gallery, Jamie Dixon, but I'm sure we're going to see much more from (he's got this awesome Eject-a-Bed project that I'm sure will appear in a number of places here on Coding4Fun, and that's just to start)
Today he's also showing off a service I've not seen before, Sky Biometry, and how he's integrated it into a Kinect app...
I am starting to work on a new Kinect application for TRINUG’s code camp. I wanted to extend the facial recognition application I did using Sky Biometry and have the Kinect identify people in its field of view. Then, I want to give the verbal command “Terminate XXX” where XXX is the name of a recognized person. That would activate a couple of servos via a netduino and point a laser pointer at that person and perhaps make a blaster sound. The <ahem> architectural diagram </ahem? looks like this
Not really worrying about how far I will get (the fun is in the process, no?), I picked up Rob Miles’s excellent book Start Here: Learn The Kinect API and plugged in my Kinect.
The first thing I did was see if I can get a running video from the Kinect –> which was very easy. I created a new C#/WPF application and replaced the default markup with this::
With the ability to identify individuals, I then wants to take individual photos of each person and feed it to Sky Biometry. To that end, I added a method to draw a rectangle around each person and then (somehow) take a snapshot of the contents within the triangle. Drawing the rectangle was a straight-forward WPF exercise:
Which is great, but now I am stuck. I need a way of isolating the contents of that rectangle in the byte array that I am feeding to bitmap encoder and I don’t know how to trim the array. Instead of trying to learn any more WPF and graphic programming, I decided to take a different tact and send the photograph in its entirety to Sky Biometry and let it figure out the people in the photograph. How I did that is the subject of my next blog post…
Project Information URL: http://jamessdixon.wordpress.com/2014/07/08/terminator-program-part-1/
Following up on my last post, I decided to send the entire photograph to Sky Biometry and have them parse the photograph and identify individual people. This ability is built right into their API. For example, if you pass them this picture, you get the following json back.
I added the red highlight to show that Sky Biometry can recognize multiple people (it is an array of uids) and that each face tag has a center.x and center:y. Reading the API documentation, this point is center of the face tag point and their point is a percentage of the photo width.
So I need to translate the center point of the skeleton from the Kinect to eqiv center point of the sky biometry recognition output and I should be able to identify individual people within the Kinect’s field of vision. Going back to the Kinect code, I ditched the DrawBoxAroundHead method and altered the UpdateDisplay method like so...
Notice that there are two rectangles because I was not sure if the Head.Position or the Skeleton.Position would match SkyBiometry. Turns out that I want the Head.Position for SkyBiometry (besides, the terminator would want head shots only)
The next step is to get the Kinect photo to Sky Biometry. I decided to use Azure Blob Storage as my intermediately location. I updated the architectural diagram like so
And I am getting a result back from Sky Biometry.
Finally, I added in the SkyBiometry X and Y coordinates for the photo and compared to the calculated ones based on the Kinect Skeleton Tracking:
And the results are encouraging –> it looks like I can use the X and Y to identify different people on the screen:
Match Value is: 53
Sky Biometry X: 10
Sky Biometry Y: 13.33
Kinect X: 47.5
Kinect Y: 39.79
Up next will be pointing the laser and the target…
Project Information URL: http://jamessdixon.wordpress.com/2014/07/08/terminator-program-part-2/
This conversation has been locked by the site admins. No new comments can be made.