Watching the Kinect for Windows v2 Jump Start. The code that they use in the videos is for Windows 8 apps but I’m trying to build my app in WPF. The problem is that WriteableBitmap for Windows 8 is substantially different from WriteableBitmap for WPF.
So here the WPF code for the first big demo… getting an infrared frame.
The XAML needs to have just the image, but I put in a button to start reading the sensor
<Button Content="Start" Click="Button_Click" VerticalAlignment="Top" /> <Image Name="image" Width="512" Height="424" HorizontalAlignment="Center" VerticalAlignment="Center" />
The C# will handle the senor initiation and the frame reading. Then it will grab the pixel data and turn it into a WriteableBitmap that acts as the source of our Image.
private void Button_Click(object sender, RoutedEventArgs e) { GetInfraredFrame(); } KinectSensor sensor; InfraredFrameReader irReader; ushort[] irData; byte[] irDataConverted; WriteableBitmap irBitmap; public void GetInfraredFrame() { // Set up the sensor and reader sensor = KinectSensor.GetDefault(); irReader = sensor.InfraredFrameSource.OpenReader(); FrameDescription fd = sensor.InfraredFrameSource.FrameDescription; irData = new ushort[fd.LengthInPixels]; irDataConverted = new byte[fd.LengthInPixels * 4]; irBitmap = new WriteableBitmap(fd.Width, fd.Height, 96, 96, PixelFormats.Bgr32, null); image.Source = irBitmap; sensor.Open(); irReader.FrameArrived += irReader_FrameArrived; } void irReader_FrameArrived(object sender, InfraredFrameArrivedEventArgs e) { using (InfraredFrame irFrame = e.FrameReference.AcquireFrame()) { if (irFrame != null) { irFrame.CopyFrameDataToArray(irData); double intensitySum = 0; for (int i = 0; i < irData.Length; i++) { byte intensity = (byte)(irData[i] >> 8); irDataConverted[i * 4] = intensity; irDataConverted[i * 4 + 1] = intensity; irDataConverted[i * 4 + 2] = intensity; irDataConverted[i * 4 + 3] = intensity; intensitySum += (double)intensity; } Int32Rect rect = new Int32Rect(0,0, (int)irBitmap.Width, (int)irBitmap.Height); int stride = (int)irBitmap.Width * 4; irBitmap.WritePixels(rect, irDataConverted, stride, 0); } } }