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 中国大陆许可协议