经过两个月的学习,终于开始了我的第一个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、启动体感仪

具体效果图如下:

kinect初学



相关文章: