经过两个月的学习,终于开始了我的第一个Kinect程序——红外图像。虽然现在看的还是官方的例子,能够运行成功也是一种进步。
下面开始我的学习之旅。
程序:
第一步:定义成员;
//体感器设备
private KinectSensor _KinectDevice = null;
//红外图像变量
//红外帧读取变量
private InfraredFrameReader _InfraredFrameReader = null;
//红外帧描述,用以得到获取的红外图像的宽度和高度,然后进行处理
private FrameDescription _InfraredFrameDescription = null;
//位图对象,用来存放经过触发事件之后的红外图像数据(处理后的像素)
private WriteableBitmap _InfraredBitmap = null;
//存放一帧红外图像像素(用以储存Kinect实时传来的数据(像素))
private ushort[] _InfraredData;
//一帧红外图像转换为bgra格式的字节数组(触发事件进行的操作,储存操作后的数据(像素))
private Byte[] _InfraredDataConverted;(bgra是一种图片像素储存格式)
第二步:主函数流程;
InitializeComponent();
//获取默认的连接的体感器
this._KinectDevice = KinectSensor.GetDefault();
//红外图像变量初始化
//红外帧读取变量初始化
this._InfraredFrameReader = this._KinectDevice.InfraredFrameSource.OpenReader();
//红外帧描述,宽度和高度
this._InfraredFrameDescription = this._KinectDevice.InfraredFrameSource.FrameDescription;
//触发红外帧事件
this._InfraredFrameReader.FrameArrived += _InfraredFrameReader_FrameArrived;
//存放红外图像的像素,无符号短整型=2字节=16位
this._InfraredData = new ushort[this._InfraredFrameDescription.LengthInPixels];
//存放红外图像的字节数组的长度=像素个数*每个像素占用的字节数4
this._InfraredDataConverted = new byte[this._InfraredFrameDescription.LengthInPixels * 4];
//位图初始化,宽度,高度,96.0表示分辨率,像素格式,blue,green,red,alpha,共32位。
this._InfraredBitmap = new WriteableBitmap(this._InfraredFrameDescription.Width,
this._InfraredFrameDescription.Height,96.0,96.0,PixelFormats.Bgra32,null);
//UI界面的图片控件和位图关联起来
image.Source = this._InfraredBitmap;
//启动体感器,虽然不懂体感仪打开为什么放在最后,懂的大佬可以和我说下,毕竟新手。。。
this._KinectDevice.Open();
红外帧处理事件:
void _InfraredFrameReader_FrameArrived(object sender, InfraredFrameArrivedEventArgs e)
{
//打开一张红外图像帧
using(InfraredFrame irFrame = e.FrameReference.AcquireFrame())
{
//红外图像帧不为空
if(irFrame != null)
{
//红外图像帧拷贝到数组
irFrame.CopyFrameDataToArray(this._InfraredData);
//遍历数组
for(int i=0;i<this._InfraredData.Length;i++)
{
//获取红外像素的强度
byte intensity = (byte)(this._InfraredData[i] >> 8);
//给blue,green,red,alpha赋值。
this._InfraredDataConverted[i * 4] = intensity;
this._InfraredDataConverted[i * 4 + 1] = intensity;
this._InfraredDataConverted[i * 4 + 2] = intensity;
this._InfraredDataConverted[i * 4 + 3] = 255;//alpha透明通道
}
//更新到位图
this._InfraredBitmap.WritePixels(new Int32Rect(0, 0, 512,424), this._InfraredDataConverted, 512*4, 0);//得到实时图像
}
}
}
综合上述的步骤得到:
1、获取默认体感仪
2、红外图像初始化
3、得到红外帧图像的高度宽度
4、触发事件
5、初始化存放红外帧像素的数组
6、存放经理处理化之后的数组
7、位图初始化,根据得到的红外图像的高度和宽度
8、将位图和UI界面关联起来
9、启动体感仪
具体效果图如下: