Showing posts with label Remove Background. Show all posts
Showing posts with label Remove Background. Show all posts

Tuesday, July 26, 2011

Kinect - Remove background of person

Microsoft Kinect SDK for Windows is now available as a free download via Microsoft Research, which will allow developers to create new uses for the motion-based system beyond gaming.

This is my first article on Kinect SDK. I have come up with a simple application created on C# using Kinect SDK.

You can check the prerequisites here for developing Kinect based application.

This application automatically identifies foreground object structure (human/any moving object) and removes its background and displays only object on the canvas.



I have attached the source code for your reference.

Link to project --> http://goo.gl/LB3LL

Source Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Research.Kinect.Audio;
using Microsoft.Research.Kinect.Nui;
namespace KinectSample
{
/// 
/// Interaction logic for MainWindow.xaml
/// 
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private Runtime kinect;
private void OnWindowsLoaded(object sender, RoutedEventArgs e)
{
kinect = new Runtime();
kinect.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepthAndPlayerIndex);
kinect.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
this.Person.Source = kinect.CreateLivePlayerRenderer();
}

private void OnWindowUnloaded(object sender, RoutedEventArgs e)
{
kinect.Uninitialize();
Environment.Exit(0);
}


}


public static class RuntimeExtensions
{
public static WriteableBitmap CreateLivePlayerRenderer(this Runtime runtime)
{
if (runtime.DepthStream.Width == 0)
throw new InvalidOperationException("Either open the depth stream before calling this method or use the overload which takes in the resolution that the depth stream will later be opened with.");
return runtime.CreateLivePlayerRenderer(runtime.DepthStream.Width, runtime.DepthStream.Height);
}
public static WriteableBitmap CreateLivePlayerRenderer(this Runtime runtime, int depthWidth, int depthHeight)
{
PlanarImage depthImage = new PlanarImage();
WriteableBitmap target = new WriteableBitmap(depthWidth, depthHeight, 96, 96, PixelFormats.Bgra32, null);
var depthRect = new System.Windows.Int32Rect(0, 0, depthWidth, depthHeight);

runtime.DepthFrameReady += (s, e) =>
{
depthImage = e.ImageFrame.Image;
//Debug.Assert(depthImage.Height == depthHeight && depthImage.Width == depthWidth);
};

runtime.VideoFrameReady += (s, e) =>
{
// don't do anything if we don't yet have a depth image
if (depthImage.Bits == null) return;

byte[] color = e.ImageFrame.Image.Bits;

byte[] output = new byte[depthWidth * depthHeight * 4];

// loop over each pixel in the depth image
int outputIndex = 0;
for (int depthY = 0, depthIndex = 0; depthY < depthHeight; depthY++)                 {                     for (int depthX = 0; depthX < depthWidth; depthX++, depthIndex += 2)                     {                         // combine the 2 bytes of depth data representing this pixel                         short depthValue = (short)(depthImage.Bits[depthIndex] | (depthImage.Bits[depthIndex + 1] << 8));                          // extract the id of a tracked player from the first bit of depth data for this pixel                         int player = depthImage.Bits[depthIndex] & 7;                          // find a pixel in the color image which matches this coordinate from the depth image                         int colorX, colorY;                         runtime.NuiCamera.GetColorPixelCoordinatesFromDepthPixel(                             e.ImageFrame.Resolution,                             e.ImageFrame.ViewArea,                             depthX, depthY, // depth coordinate                             depthValue,  // depth value                             out colorX, out colorY);  // color coordinate                          // ensure that the calculated color location is within the bounds of the image                         colorX = Math.Max(0, Math.Min(colorX, e.ImageFrame.Image.Width - 1));                         colorY = Math.Max(0, Math.Min(colorY, e.ImageFrame.Image.Height - 1));                          output[outputIndex++] = color[(4 * (colorX + (colorY * e.ImageFrame.Image.Width))) + 0];                         output[outputIndex++] = color[(4 * (colorX + (colorY * e.ImageFrame.Image.Width))) + 1];                         output[outputIndex++] = color[(4 * (colorX + (colorY * e.ImageFrame.Image.Width))) + 2];                         output[outputIndex++] = player > 0 ? (byte)255 : (byte)0;
}
}
target.WritePixels(depthRect, output, depthWidth * PixelFormats.Bgra32.BitsPerPixel / 8, 0);
};
return target;
}
}

}




Please feel free to contact me incase of any queries.