Kinect学习(4)Using Kinect for Windows with XNA 彩色摄像头

开发环境:Windows 8+VS2012+Kinect(SDK v1.6) 。

注:VS2012开发XNA游戏环境配置参照《在vs 2012 中使用xna 4.0 做开发!

  • 新建决解方案KinectCamDemo,项目名称KinectCam。

  • 添加引用。右键项目—>添加引用—>选中Microsoft.Kinect.dll—>确定。

  • 打开Game1.cs,重命名为:KinectCameraGame ,接下来,添加命名空间。
    using Microsoft.Kinect;
  • 定义私有成员变量
    KinectSensor kinect;

    Texture2D kinectVideoTexture;
    Rectangle videoDisplayRecatangle;
    byte[] colorData = null;
  • 加载游戏所有内容的时候启动Kinect设备
        /// <summary>
        /// 对于每个游戏会调用一次 LoadContent,
        /// 用于加载所有内容。
        /// </summary>
        protected override void LoadContent()
        {
            // 创建新的 SpriteBatch,可将其用于绘制纹理。
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: 在此处使用 this.Content 加载游戏内容
            //启动Kinect设备
            kinect = KinectSensor.KinectSensors.Where(k => k.Status == KinectStatus.Connected).FirstOrDefault();
            kinect.ColorStream.Enable();
            kinect.ColorFrameReady += kinect_ColorFrameReady;
            kinect.Start();

        }
  • 彩色图像流事件处理
  void kinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            //获取图像,显示
            using (ColorImageFrame colorFrame=e.OpenColorImageFrame())
            {
                if (colorFrame==null)
                {
                    return;
                }
                if (colorData==null)
                {
                    colorData = new byte[colorFrame.Width * colorFrame.Height * 4];
                   
                }
                colorFrame.CopyPixelDataTo(colorData);
                kinectVideoTexture = new Texture2D(GraphicsDevice, colorFrame.Width, colorFrame.Height);
                Color[] bitmap = new Color[colorFrame.Width * colorFrame.Height];
                int sourceOffest = 0;
                for (int i = 0; i < bitmap.Length; i++)
                {
                    bitmap[i] = new Color(colorData[sourceOffest + 2],colorData[sourceOffest+1],colorData[sourceOffest],255);
                    sourceOffest+=4;
                }
                kinectVideoTexture.SetData(bitmap);
            }
        }
  • 绘制图象,显示在界面
        /// <summary>
        /// 当游戏该进行自我绘制时调用此项。
        /// </summary>
        /// <param name="gameTime">提供计时值的快照。</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: 在此处添加绘图代码
            spriteBatch.Begin();
            if (kinectVideoTexture != null)
            {
                spriteBatch.Draw(kinectVideoTexture, videoDisplayRecatangle, Color.White);

            }
            spriteBatch.End();
            base.Draw(gameTime);
        }
  • 卸载游戏是,停止Kinect设备
     /// <summary>
        /// 对于每个游戏会调用一次 UnloadContent,
        /// 用于取消加载所有内容。
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: 在此处取消加载任何非 ContentManager 内容
            this.kinect.Stop();
        }


最后,显示的效果。

 

 

 

作者:十一_x
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议
原文地址:https://www.cnblogs.com/shiyix/p/2853271.html