很久没来写简单教程了,不是我懒,好吧,我承认有点懒!不过真的很忙,而且最近安排的又换方向了,你说我刚入点门,想深入学习呢,目前要去做点硬件的事,没办法只能去补脑了!
今天的带来的深度图像,很简单,步骤还是那么几步:1.获取体感设备;2.图像帧初始化;3.帧描述;4.帧触发事件;5. 创立一个位图显示采集的影像。红外彩色深度其实都差不了多少,特别是彩色和深度,你会发现代码没变化一样。
好了,基础还是要讲完的,虽然一样,但是重复做才能记得熟,程序员本来大多就是在做一个循环的过程,下次开始我会坚持写点好玩的,不定期的放上我的一些有趣的小Demo,以后也会尽量写一些其它的,比如我最近学习的硬件的一些知识,当是给自己加个记忆,一分享一下解决遇到的问题!
放代码了:
变量的设置:
//体感器设备
private KinectSensor kinectDevice;
//深度帧读取变量
private DepthFrameReader depthFrameReader;
//深度帧描述
private FrameDescription depthFrameDesription;
//位图对象
private WriteableBitmap depthBitmap;
//存放一帧深度图像的矩形框
private Int32Rect depthBitmapRect;
//深度像素数组转化为矩形框的长度
private int depthStride;
//深度图像像素数据
private ushort[] depthPixelData;
主程序代码:(简直和彩色数据一模一样,color换成了depth,存储格式变了而已)
InitializeComponent();
//获取默认的连接的体感器
this.kinectDevice = KinectSensor.GetDefault();
//深度图像变量初始化
this.depthFrameReader = this.kinectDevice.DepthFrameSource.OpenReader();
//深度帧描述,宽度和高度
this.depthFrameDesription = this.kinectDevice.DepthFrameSource.FrameDescription;
//触发深度帧事件
this.depthFrameReader.FrameArrived += _DepthFrameReader_FrameArrived;
//位图初始化,宽度,高度,96.0表示分辨率,像素格式
this.depthBitmap = new WriteableBitmap(this.depthFrameDesription.Width, this.depthFrameDesription.Height, 96.0, 96.0, PixelFormats.Gray16, null);
//存放图像像素的矩形框
this.depthBitmapRect = new Int32Rect(0, 0, this.depthBitmap.PixelWidth, this.depthBitmap.PixelHeight);
//存放深度图像的字节数组的长度=帧宽度*帧高度
this.depthPixelData = new ushort[this.depthFrameDesription.LengthInPixels]; //取代宽度*高度,更加方便
//步长:宽度*2字节/像素
this.depthStride = this.depthFrameDesription.Width * 2;
//显示影像
depthImage.Source = this.depthBitmap;
this.kinectDevice.Open();
体感器的处理事件:
void _DepthFrameReader_FrameArrived(object sender, DepthFrameArrivedEventArgs e)
{
//获取一帧深度图像
using (DepthFrame depthFrame = e.FrameReference.AcquireFrame())
{
//如果获取成功
if (depthFrame != null)
{
//将深度帧数据存放在字节数组里面
depthFrame.CopyFrameDataToArray(this.depthPixelData);
//将数组的像素写入矩形框,渲染位图。
this.depthBitmap.WritePixels(this.depthBitmapRect, this.depthPixelData, this.depthStride,0);
}
}
}
效果如下: