如何写入磁盘/保存ColorStream和SkeltetonStream数据Kinect SDK& XNA [英] How to write to disk/ save ColorStream and SkeltetonStream data Kinect SDK & XNA

查看:72
本文介绍了如何写入磁盘/保存ColorStream和SkeltetonStream数据Kinect SDK& XNA的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Kinect SDK的新手,我正在进行Kinect SDK研究。我已经工作了大约一个星期来将SDK与XNA集成。我终于得到了RGB摄像机数据显示在屏幕上,并跟踪一个由白球证实的关节,它随之移动

I am new to the Kinect SDK and I am conducting Kinect SDK research. I have been working for about a week now to integrate the SDK with XNA. I finally got the RGB camera data to show on the screen, and tracking a joint proven by the white ball that moves with it.

我的最终目标是找到一种方法保存此相机&骨架数据到磁盘,以便以后查看此数据。现在我可以在每个周期将x,y坐标保存到txt文件,但是我想在视频和/或帧出现时记录它们。

My ultimate goal is to find a way to save this Camera & Skeletal data to disk in order to review this data at a later date. Right now I can save the x, y coordinates to a txt file every cycle, but i'd like to record the video and/or frames as they occur.

任何建议都会非常有用。

Any suggestions would be very helpful.

C#btw。

  Here是我的代码:

 Here is my code:

使用系统;

使用System.Collections.Generic;

使用System.Linq;

使用Microsoft.Xna.Framework;

使用Microsoft.Xna.Framework.Audio;

使用Microsoft.Xna.Framework.Content;

使用Microsoft.Xna.Framework.GamerServices;

使用Microsoft.Xna.Framework.Graphics;

使用Microsoft.Xna.Framework.Input;

使用Microsoft.Xna.Framework.Media;

使用Microsoft.Kinect;

使用System.IO;



$


名称空间Kinect_Stroke

{

    ///< summary>

    ///这是您游戏的主要类型

    ///< / summary>

   公共课Game1:Microsoft.Xna.Framework.Game

    {

        
$


        GraphicsDeviceManager图形;

        SpriteBatch spriteBatch;

        StreamWriter writer = new StreamWriter(" myfile.txt");



        StreamWriter writer2 = new StreamWriter(" myRgbData.txt");

            



            
$


        Texture2D kinectRGBVideo;

        Texture2D叠加;

        Texture2D hand;



        Vector2 handPosition = new Vector2();
$


        KinectSensor kinectSensor;



        SpriteFont字体;



        
$


        string connectedStatus =" Not connected";
$


       公共Game1()

        {

            graphics = new GraphicsDeviceManager(this);

            Content.RootDirectory =" Content"; $


            graphics.PreferredBackBufferWidth = 640;

            graphics.PreferredBackBufferHeight = 480;



        }


        void KinectSensors_StatusChanged(object sender,StatusChangedEventArgs e)

        {

            if(this.kinectSensor == e.Sensor)

            {

               如果(e.Status == KinectStatus.Disconnected ||

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP; e.Status == KinectStatus.NotPowered)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; this.kinectSensor = NULL;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP; this.DiscoverKinectSensor();

                }
            }
        }


        private bool InitializeKinect()

        {

            kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; kinectSensor.ColorFrameReady + = new EventHandler< ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);



           &NBSP; // Skeleton Stream

        kinectSensor.SkeletonStream.Enable(新TransformSmoothParameters()

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;平滑= 0.5F,

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;纠错= 0.5f,

            Prediction = 0.5f,

   &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; JitterRadius = 0.05f,

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;  MaxDeviationRadius = 0.04f

       });
$
      &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; kinectSensor.SkeletonFrameReady + = new EventHandler< SkeletonFrameReadyEventArgs>(kinectSensor_SkeletonFrameReady);

           试试
            {

                kinectSensor.Start();

            }
            catch

            {

                connectedStatus = QUOT;无法启动Kinect感应英寸;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;返回false;

            }
           返回true;

        }


        void kinectSensor_SkeletonFrameReady(object sender,SkeletonFrameReadyEventArgs e)

        {

            using(SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())

            {

                if(skeletonFrame!= null)

                {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; // INT skeletonSlot = 0;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;骨架[] skeletonData =新骨架[skeletonFrame.SkeletonArrayLength];



&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; skeletonFrame.CopySkeletonDataTo(skeletonData);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;骨架playerSkeleton =(从s中skeletonData其中s.TrackingState == SkeletonTrackingState.Tracked选择多个).FirstOrDefault();

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;如果(playerSkeleton!= NULL)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;关节右手= playerSkeleton.Joints [JointType.HandRight];

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; handPosition = new Vector2((((0.5f * rightHand.Position.X)+ 0.5f)*(640)),((( - 0.5f * rightHand.Position.Y)+ 0.5f)
*( 480)));

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP; &NBSP;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP; &NBSP;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP; &NBSP;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
                }
            }
        }


        void kinectSensor_ColorFrameReady(object sender,ColorImageFrameReadyEventArgs e)

        {

           使用(ColorImageFrame colorImageFrame = e.OpenColorImageFrame())

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

                if(colorImageFrame!= null)

                {



                  ;&NBSP;&NBSP;字节[] pixelsFromFrame =新的字节[colorImageFrame.PixelDataLength];



&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; colorImageFrame.CopyPixelDataTo(pixelsFromFrame);



&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;颜色[]颜色=新颜色[colorImageFrame.Height * colorImageFrame.Width];

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; kinectRGBVideo = new Texture2D(graphics.GraphicsDevice,colorImageFrame.Width,colorImageFrame.Height);
$


         &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; //转到通过每个像素,并设置字节正确

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP; //记住,每个像素获得了红,绿,蓝

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP; INT索引= 0;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;对(INT Y = 0; Y< colorImageFrame.Height; Y ++)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;对(INT X = 0; X< colorImageFrame.Width; X ++,指数+ = 4)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;颜色[Y * colorImageFrame.Width + X] =新的色彩(pixelsFromFrame [指数+ 2],pixelsFromFrame [指数
+ 1],pixelsFromFrame [指数+ 0]);

&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }



&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;从ColorImageFrame到一个Texture2D

&NBSP //设置PixelData取出;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP; kinectRGBVideo.SetData(color);

                }
            }
        }


        private void DiscoverKinectSensor()

        {

            foreach(KinectSensor.KinectSensors中的KinectSensor传感器)

            {

               如果(sensor.Status == KinectStatus.Connected)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; //找到一个,将我们的传感器设置为此<
                 &NBSP;&NBSP;&NBSP; kinectSensor =传感器;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;休息;

                }
            }


            if(this.kinectSensor == null)

            {

                connectedStatus = QUOT;实测值无Kinect的传感器连接到USB英寸;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;返回;

            }


            //您可以使用kinectSensor.Status来检查状态

            //并向用户提供某种反馈

            switch(kinectSensor.Status)

            {

               案例KinectStatus.Connected:

                {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP; connectedStatus = QUOT;状态:已连接英寸;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;休息;

                }
               案例KinectStatus.Disconnected:

                {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP; connectedStatus = QUOT;状态:断开英寸;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;休息;

                }
               情况下KinectStatus.NotPowered:

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP; connectedStatus = QUOT;状态:连接电源英寸;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;休息;

                }
               默认值:

                {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP; connectedStatus = QUOT;状态:错误英寸;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;休息;

                }
            }


            //初始化找到并连接的设备

            if(kinectSensor.Status == KinectStatus.Connected)

            {

                InitializeKinect();

            }
        }


        protected override void Initialize()

        {

            KinectSensor.KinectSensors.StatusChanged + = new EventHandler< StatusChangedEventArgs>(KinectSensors_StatusChanged);

            DiscoverKinectSensor();
$


            base.Initialize();

        }


        protected override void LoadContent()

        {

            spriteBatch = new SpriteBatch(GraphicsDevice);



            kinectRGBVideo = new Texture2D(GraphicsDevice,1337,1337);

            hand = Content.Load< Texture2D>(" hand");

           覆盖= Content.Load<的Texture2D>(" UTCNSFREU");

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; font = Content.Load< SpriteFont>(&SpriteFont1");

        }


        protected override void UnloadContent()

        {

            kinectSensor.Stop();

            kinectSensor.Dispose();

        }


        protected override void Update(GameTime gameTime)

        {

            

            



            writer.WriteLine(handPosition);

            //kinectRGBVideo.SaveAsJpeg(1,640,480);

            //writer.Close();

            



           如果(GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP; this.Exit();
$


            base.Update(gameTime);

        }


        protected override void Draw(GameTime gameTime)

        {

            GraphicsDevice.Clear(Color.CornflowerBlue);



            spriteBatch.Begin();

            spriteBatch.Draw(kinectRGBVideo,新的Rectangle(0,0,640,480),Color.White);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; spriteBatch.Draw(hand,handPosition,Color.White);

            spriteBatch.Draw(overlay,new Rectangle(0,0,640,480),Color.White);

           ;&NBSP; spriteBatch.DrawString(字体,connectedStatus,新Vector2(20,80),Color.White);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; spriteBatch.End();
$


            base.Draw(gameTime);

        }




$




        public void Record(SkeletonFrame frame)

        {

            if(writer == null)

               抛出新的例外("你必须在致电记录之前致电开始");
$


          &NBSP;&NBSP; TimeSpan timeSpan = DateTime.Now.Subtract(referenceTime);

            referenceTime = DateTime.Now;

            writer.Write((long)timeSpan.TotalMilliseconds);

            writer.Write(frame.FloorClipPlane);

            writer.Write((int)frame.Quality);

            writer.Write(frame.NormalToGravity);
$


            writer.Write(frame.Skeletons.Length);
$


            foreach(Frame.Skeletons中的SkeletonData骨架)

            {

                writer.Write((int)的skeleton.TrackingState);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; writer.Write(skeleton.Position);

                writer.Write(skeleton.TrackingID);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; writer.Write(skeleton.EnrollmentIndex);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; writer.Write(skeleton.UserIndex);

                writer.Write((int)skeleton.Quality);
$


            &NBSP;&NBSP;&NBSP;&NBSP; writer.Write(skeleton.Joints.Count);

               的foreach(在skeleton.Joints联合关节)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; writer.Write((int)joint.ID);

                &NBSP;&NBSP;&NBSP;&NBSP; writer.Write((int)的joint.TrackingState);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP; writer.Write(joint.Position);

                }
            }
        }




$
 





        



    } b $ b}

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Kinect;
using System.IO;



namespace Kinect_Stroke
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        

        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        StreamWriter writer = new StreamWriter("myfile.txt");

        StreamWriter writer2 = new StreamWriter("myRgbData.txt");
            

            

        Texture2D kinectRGBVideo;
        Texture2D overlay;
        Texture2D hand;

        Vector2 handPosition = new Vector2();

        KinectSensor kinectSensor;

        SpriteFont font;

        

        string connectedStatus = "Not connected";

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            graphics.PreferredBackBufferWidth = 640;
            graphics.PreferredBackBufferHeight = 480;

        }

        void KinectSensors_StatusChanged(object sender, StatusChangedEventArgs e)
        {
            if (this.kinectSensor == e.Sensor)
            {
                if (e.Status == KinectStatus.Disconnected ||
                    e.Status == KinectStatus.NotPowered)
                {
                    this.kinectSensor = null;
                    this.DiscoverKinectSensor();
                }
            }
        }

        private bool InitializeKinect()
        {
            kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
            kinectSensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);

            // Skeleton Stream
        kinectSensor.SkeletonStream.Enable(new TransformSmoothParameters()
        {
            Smoothing = 0.5f,
            Correction = 0.5f,
            Prediction = 0.5f,
            JitterRadius = 0.05f,
            MaxDeviationRadius = 0.04f
        });
            kinectSensor.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinectSensor_SkeletonFrameReady);
            try
            {
                kinectSensor.Start();
            }
            catch
            {
                connectedStatus = "Unable to start the Kinect Sensor";
                return false;
            }
            return true;
        }

        void kinectSensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {
                if (skeletonFrame != null)
                {
                    //int skeletonSlot = 0;
                    Skeleton[] skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength];

                    skeletonFrame.CopySkeletonDataTo(skeletonData);
                    Skeleton playerSkeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault();
                    if (playerSkeleton != null)
                    {
                        Joint rightHand = playerSkeleton.Joints[JointType.HandRight];
                        handPosition = new Vector2((((0.5f * rightHand.Position.X) + 0.5f) * (640)), (((-0.5f * rightHand.Position.Y) + 0.5f) * (480)));
                       
                        
                         
                    }
                }
            }
        }

        void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            using (ColorImageFrame colorImageFrame = e.OpenColorImageFrame())
            {
                if (colorImageFrame != null)
                {

                    byte[] pixelsFromFrame = new byte[colorImageFrame.PixelDataLength];

                    colorImageFrame.CopyPixelDataTo(pixelsFromFrame);

                    Color[] color = new Color[colorImageFrame.Height * colorImageFrame.Width];
                    kinectRGBVideo = new Texture2D(graphics.GraphicsDevice, colorImageFrame.Width, colorImageFrame.Height);

                    // Go through each pixel and set the bytes correctly
                    // Remember, each pixel got a Red, Green and Blue
                    int index = 0;
                    for (int y = 0; y < colorImageFrame.Height; y++)
                    {
                        for (int x = 0; x < colorImageFrame.Width; x++, index += 4)
                        {
                            color[y * colorImageFrame.Width + x] = new Color(pixelsFromFrame[index + 2], pixelsFromFrame[index + 1], pixelsFromFrame[index + 0]);
                        }
                    }

                    // Set pixeldata from the ColorImageFrame to a Texture2D
                    kinectRGBVideo.SetData(color);
                }
            }
        }

        private void DiscoverKinectSensor()
        {
            foreach (KinectSensor sensor in KinectSensor.KinectSensors)
            {
                if (sensor.Status == KinectStatus.Connected)
                {
                    // Found one, set our sensor to this
                    kinectSensor = sensor;
                    break;
                }
            }

            if (this.kinectSensor == null)
            {
                connectedStatus = "Found none Kinect Sensors connected to USB";
                return;
            }

            // You can use the kinectSensor.Status to check for status
            // and give the user some kind of feedback
            switch (kinectSensor.Status)
            {
                case KinectStatus.Connected:
                {
                        connectedStatus = "Status: Connected";
                        break;
                }
                case KinectStatus.Disconnected:
                {
                        connectedStatus = "Status: Disconnected";
                        break;
                }
                case KinectStatus.NotPowered:
                {
                        connectedStatus = "Status: Connect the power";
                        break;
                }
                default:
                {
                        connectedStatus = "Status: Error";
                        break;
                }
            }

            // Init the found and connected device
            if (kinectSensor.Status == KinectStatus.Connected)
            {
                InitializeKinect();
            }
        }

        protected override void Initialize()
        {
            KinectSensor.KinectSensors.StatusChanged += new EventHandler<StatusChangedEventArgs>(KinectSensors_StatusChanged);
            DiscoverKinectSensor();

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            kinectRGBVideo = new Texture2D(GraphicsDevice, 1337, 1337);
            hand = Content.Load<Texture2D>("hand");
            overlay = Content.Load<Texture2D>("UTCNSFREU");
            font = Content.Load<SpriteFont>("SpriteFont1");
        }

        protected override void UnloadContent()
        {
            kinectSensor.Stop();
            kinectSensor.Dispose();
        }

        protected override void Update(GameTime gameTime)
        {
            
            

            writer.WriteLine(handPosition);
            //kinectRGBVideo.SaveAsJpeg(1, 640, 480);
            //writer.Close();
            

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();
            spriteBatch.Draw(kinectRGBVideo, new Rectangle(0, 0, 640, 480), Color.White);
            spriteBatch.Draw(hand, handPosition, Color.White);
            spriteBatch.Draw(overlay, new Rectangle(0, 0, 640, 480), Color.White);
            spriteBatch.DrawString(font, connectedStatus, new Vector2(20, 80), Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }






        public void Record(SkeletonFrame frame)
        {
            if (writer == null)
                throw new Exception("You must call Start before calling Record");

            TimeSpan timeSpan = DateTime.Now.Subtract(referenceTime);
            referenceTime = DateTime.Now;
            writer.Write((long)timeSpan.TotalMilliseconds);
            writer.Write(frame.FloorClipPlane);
            writer.Write((int)frame.Quality);
            writer.Write(frame.NormalToGravity);

            writer.Write(frame.Skeletons.Length);

            foreach (SkeletonData skeleton in frame.Skeletons)
            {
                writer.Write((int)skeleton.TrackingState);
                writer.Write(skeleton.Position);
                writer.Write(skeleton.TrackingID);
                writer.Write(skeleton.EnrollmentIndex);
                writer.Write(skeleton.UserIndex);
                writer.Write((int)skeleton.Quality);

                writer.Write(skeleton.Joints.Count);
                foreach (Joint joint in skeleton.Joints)
                {
                    writer.Write((int)joint.ID);
                    writer.Write((int)joint.TrackingState);
                    writer.Write(joint.Position);
                }
            }
        }



 


        

    }
}

推荐答案

你看过Kinect吗? Stduio?它记录了Kinect的颜色和深度流。播放深度数据时,运行时将生成骨架数据。

Have you looked at Kinect Stduio? It records the Color and Depth streams from the Kinect. The skeletal data will be generated by the runtime when the depth data is played back.


这篇关于如何写入磁盘/保存ColorStream和SkeltetonStream数据Kinect SDK&amp; XNA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆