废话不多说,直接进入正题!
Kinect+VS2012显示彩色图像数据流
1、新建C# WPF应用程序,项目名随便写即可。
2、在解决方案“….”里右击“引用”—>添加引用,
然后在”搜索程序集”那里搜索”Microsoft.Kinect”,然后添加即可。
3、在WPF里添加必要的属性和元素.
<Window x:Class="ColorView.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="500" Width="650" Loaded="Window_Loaded_1" Closed="Window_Closed_1">
<Grid>
<Canvas Name="CanvasWindow" Height="480" Width="640">
<Image Name="ColorName" Height="480" Width="640"/>
</Canvas>
</Grid>
</Window>
其中后两组Height、Width属性最好与图像的高和宽对应成比例;“
Loaded”和Closed“”属性在源码中会对应生成相应的函数(见下文源码),可根据提示按“Tab”键添加;
“ColorName”是我们要显示彩色图像的元素的名字,源码中会用到;
“CanvasWindow”在本篇中暂时用不到,所以随便写或者不用添加也行。
4、源码解读
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Kinect;
namespace ColorView
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private KinectSensor kinectSensor;
private byte[] colorPixelData;
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
kinectSensor = KinectSensor.KinectSensors[0];
kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution1280x960Fps12);
kinectSensor.ColorFrameReady += kinectSensor_ColorFrameReady;
kinectSensor.Start();
}
private void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame colorImageFrame = e.OpenColorImageFrame())
{
if (colorImageFrame != null)
{
colorPixelData = new byte[colorImageFrame.PixelDataLength];
colorImageFrame.CopyPixelDataTo(colorPixelData);
ColorName.Source = BitmapSource.Create(colorImageFrame.Width, colorImageFrame.Height, 96, 96,
PixelFormats.Bgr32, null, colorPixelData, colorImageFrame.Width * 4);
}
}
}
private void Window_Closed_1(object sender, EventArgs e)
{
if (kinectSensor != null && kinectSensor.Status == KinectStatus.Connected)
kinectSensor.Stop();
}
}
}
运行结果如下图:
如果按以上步骤操作的话,上述代码直接复制过去应该可以直接运行