You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
7.4 KiB
206 lines
7.4 KiB
//------------------------------------------------------------------------------
|
|
// <copyright file="MainPage.xaml.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System.ComponentModel;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices.WindowsRuntime;
|
|
using Windows.ApplicationModel.Resources;
|
|
using Windows.UI.Xaml;
|
|
using Windows.UI.Xaml.Controls;
|
|
using Windows.UI.Xaml.Media.Imaging;
|
|
using WindowsPreview.Kinect;
|
|
|
|
namespace Microsoft.Samples.Kinect.ColorBasics
|
|
{
|
|
/// <summary>
|
|
/// An empty page that can be used on its own or navigated to within a Frame.
|
|
/// </summary>
|
|
public sealed partial class MainPage : Page, INotifyPropertyChanged
|
|
{
|
|
/// <summary>
|
|
/// Resource loader for string resources
|
|
/// </summary>
|
|
private ResourceLoader resourceLoader = new ResourceLoader("Resources");
|
|
|
|
/// <summary>
|
|
/// Size of the RGB pixel in the bitmap
|
|
/// </summary>
|
|
private readonly uint bytesPerPixel;
|
|
|
|
/// <summary>
|
|
/// Active Kinect sensor
|
|
/// </summary>
|
|
private KinectSensor kinectSensor = null;
|
|
|
|
/// <summary>
|
|
/// Reader for color frames
|
|
/// </summary>
|
|
private ColorFrameReader colorFrameReader = null;
|
|
|
|
/// <summary>
|
|
/// Bitmap to display
|
|
/// </summary>
|
|
private WriteableBitmap bitmap = null;
|
|
|
|
/// <summary>
|
|
/// Intermediate storage for receiving frame data from the sensor
|
|
/// </summary>
|
|
private byte[] colorPixels = null;
|
|
|
|
/// <summary>
|
|
/// Current status text to display
|
|
/// </summary>
|
|
private string statusText = null;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the MainPage class.
|
|
/// </summary>
|
|
public MainPage()
|
|
{
|
|
// get the kinectSensor object
|
|
this.kinectSensor = KinectSensor.GetDefault();
|
|
|
|
// open the reader for the color frames
|
|
this.colorFrameReader = this.kinectSensor.ColorFrameSource.OpenReader();
|
|
|
|
// wire handler for frame arrival
|
|
this.colorFrameReader.FrameArrived += this.Reader_ColorFrameArrived;
|
|
|
|
// create the colorFrameDescription from the ColorFrameSource using rgba format
|
|
FrameDescription colorFrameDescription = this.kinectSensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Rgba);
|
|
|
|
// rgba is 4 bytes per pixel
|
|
this.bytesPerPixel = colorFrameDescription.BytesPerPixel;
|
|
|
|
// allocate space to put the pixels to be rendered
|
|
this.colorPixels = new byte[colorFrameDescription.Width * colorFrameDescription.Height * this.bytesPerPixel];
|
|
|
|
// create the bitmap to display
|
|
this.bitmap = new WriteableBitmap(colorFrameDescription.Width, colorFrameDescription.Height);
|
|
|
|
// set IsAvailableChanged event notifier
|
|
this.kinectSensor.IsAvailableChanged += this.Sensor_IsAvailableChanged;
|
|
|
|
// open the sensor
|
|
this.kinectSensor.Open();
|
|
|
|
// set the status text
|
|
this.StatusText = this.kinectSensor.IsAvailable ? resourceLoader.GetString("RunningStatusText")
|
|
: resourceLoader.GetString("NoSensorStatusText");
|
|
|
|
// use the window object as the view model in this simple example
|
|
this.DataContext = this;
|
|
|
|
// initialize the components (controls) of the window
|
|
this.InitializeComponent();
|
|
theImage.Source = this.bitmap;
|
|
}
|
|
|
|
/// <summary>
|
|
/// INotifyPropertyChangedPropertyChanged event to allow window controls to bind to changeable data.
|
|
/// </summary>
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the current status text to display
|
|
/// </summary>
|
|
public string StatusText
|
|
{
|
|
get
|
|
{
|
|
return this.statusText;
|
|
}
|
|
|
|
set
|
|
{
|
|
if (this.statusText != value)
|
|
{
|
|
this.statusText = value;
|
|
|
|
// notify any bound elements that the text has changed
|
|
if (this.PropertyChanged != null)
|
|
{
|
|
this.PropertyChanged(this, new PropertyChangedEventArgs("StatusText"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Execute shutdown tasks.
|
|
/// </summary>
|
|
/// <param name="sender">object sending the event</param>
|
|
/// <param name="e">event arguments</param>
|
|
private void MainPage_Unloaded(object sender, RoutedEventArgs e)
|
|
{
|
|
if (this.colorFrameReader != null)
|
|
{
|
|
// ColorFrameReder is IDisposable
|
|
this.colorFrameReader.Dispose();
|
|
this.colorFrameReader = null;
|
|
}
|
|
|
|
if (this.kinectSensor != null)
|
|
{
|
|
this.kinectSensor.Close();
|
|
this.kinectSensor = null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles the color frame data arriving from the sensor.
|
|
/// </summary>
|
|
/// <param name="sender">object sending the event</param>
|
|
/// <param name="e">event arguments</param>
|
|
private void Reader_ColorFrameArrived(object sender, ColorFrameArrivedEventArgs e)
|
|
{
|
|
bool colorFrameProcessed = false;
|
|
|
|
// ColorFrame is IDisposable
|
|
using (ColorFrame colorFrame = e.FrameReference.AcquireFrame())
|
|
{
|
|
if (colorFrame != null)
|
|
{
|
|
FrameDescription colorFrameDescription = colorFrame.FrameDescription;
|
|
|
|
// verify data and write the new color frame data to the Writeable bitmap
|
|
if ((colorFrameDescription.Width == this.bitmap.PixelWidth) && (colorFrameDescription.Height == this.bitmap.PixelHeight))
|
|
{
|
|
if (colorFrame.RawColorImageFormat == ColorImageFormat.Bgra)
|
|
{
|
|
colorFrame.CopyRawFrameDataToBuffer(this.bitmap.PixelBuffer);
|
|
}
|
|
else
|
|
{
|
|
colorFrame.CopyConvertedFrameDataToBuffer(this.bitmap.PixelBuffer, ColorImageFormat.Bgra);
|
|
}
|
|
|
|
colorFrameProcessed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// we got a frame, render
|
|
if (colorFrameProcessed)
|
|
{
|
|
this.bitmap.Invalidate();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles the event which the sensor becomes unavailable (E.g. paused, closed, unplugged).
|
|
/// </summary>
|
|
/// <param name="sender">object sending the event</param>
|
|
/// <param name="e">event arguments</param>
|
|
private void Sensor_IsAvailableChanged(object sender, IsAvailableChangedEventArgs e)
|
|
{
|
|
// on failure, set the status text
|
|
this.StatusText = this.kinectSensor.IsAvailable ? resourceLoader.GetString("RunningStatusText")
|
|
: resourceLoader.GetString("SensorNotAvailableStatusText");
|
|
}
|
|
}
|
|
}
|