C#WPF-VS中的Kinect和Leap Motion数据检索

时间:2015-03-19 06:31:35

标签: c# wpf visual-studio-2012

目标:同时从Leap Motion和Kinect检索数据以进行计算。

问题:我能够从kinect和leap运动中获取数据。但是,当跳跃动作正在读取我手指的坐标时,相机/ kinect读数会冻结,直到我从Leap Motion传感器上移开手。

可能的解决方案:我在想,如果我将它们都放在一个单独的线程上,我应该能够在不中断的情况下从两个传感器获取数据。我尝试了很多方法,但没有成功,任何想法?

代码:这是我一直在使用的代码。

MainWindow.Xaml.cs Class in WPF Visual Studio

namespace KinectLeap
{
    public partial class MainWindow
    {
        /// <summary>
        /// Default CTOR
        /// </summary>
        public MainWindow()
        {
            MainWindow1 kinect = new MainWindow1(this);
            MainWindow2 leapMot = new MainWindow2(this);
            // Initialize Components
            //InitializeComponent();

            kinect.DoWork();
            leapMot.DoWork();

            //MonitorSample thread = new MonitorSample(this);
            //thread.MonitorSampleM();

            //Task.Factory.StartNew(kinect.Initialize);
            // Initialize Leap Motion
            //Task.WaitAll();

            //Task.Factory.StartNew(leapMot.InitializeLM);
            //Task.WaitAll();
        }

        public void UpdateKT(Object[] data)
        {
         }

        public void UpdateLM(String[] data)
        {
        }

    }
}

LeapMotion Class to access data from the Leap Motion Sensor

namespace LeapMotion
{
    public partial class MainWindow2 : Window, ILeapEventDelegate
    {
        MainWindow update;

        private Controller controller = new Controller();
        private LeapEventListener listener;
        private Boolean isClosing = false;

        /// <summary>
        /// Default CTOR
        /// </summary>
        public MainWindow2(MainWindow thread)
        {
            update = thread;
            //Initialize();
            // Initialize Leap Motion
            //InitializeLM();
        }

        public MainWindow2()
        {
            // TODO: Complete member initialization
        }


        #region Leap Motion code
        // Volatile is used as hint to the compiler that this data 
        // member will be accessed by multiple threads. 

        private delegate void NoArgDelegate();
        private delegate void OneArgDelegate(String[] arg);
        String[] data = new String[8];

        public void DoWork()
        {

            this.controller = new Controller();
            this.listener = new LeapEventListener(this);
            controller.AddListener(listener);

        }

        delegate void LeapEventDelegate(string EventName);
        public void LeapEventNotification(string EventName)
        {
            if (this.CheckAccess())
            {
                switch (EventName)
                {
                    case "onInit":
                        Debug.WriteLine("Init");
                        break;
                    case "onConnect":
                        this.connectHandler();
                        break;
                    case "onFrame":
                        if (!this.isClosing)
                        { 

                            this.newFrameHandler(this.controller.Frame());

                            //Task.Factory.StartNew(() => this.newFrameHandler(this.controller.Frame()));
                            //Task.WaitAll();
                        }
                        break;
                    case "onDisconnect":
                        this.onDisconnect();
                        break;

                }
            }
            else
            {
                //this.onDisconnect();
                Dispatcher.Invoke(new LeapEventDelegate(LeapEventNotification), new object[] { EventName });

            }
        }

        void onDisconnect()
        {

           // this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                     // (ThreadStart)delegate()
                     // {
                          // Update Leap Motion UI
                          data[0] = "No hand tracked";
                          data[1] = "No hand tracked";
                          data[2] = "No hand tracked";
                          data[3] = "No hand tracked";
                          data[4] = "No hand tracked";
                          data[5] = "No hand tracked";
                          data[6] = "No hand tracked";
                          data[7] = "No hand tracked";

                          update.UpdateLM(data);
                     // }
                      // );

        }
        void connectHandler()
        {
            this.controller.SetPolicy(Controller.PolicyFlag.POLICY_IMAGES);
            this.controller.EnableGesture(Gesture.GestureType.TYPE_SWIPE);
            this.controller.Config.SetFloat("Gesture.Swipe.MinLength", 100.0f);
        }

        void newFrameHandler(Leap.Frame frame)
        {
        }

        void MainWindow_Closing(object sender, EventArgs e)
        {
            this.isClosing = true;
            this.controller.RemoveListener(this.listener);
            this.controller.Dispose();
        }
     }
        #endregion
}


Kinect Class to access data from the Kinect sensor
namespace Kinect
{
    public partial class MainWindow1 : Window
    {
        MainWindow update;


        /// <summary>
        /// Instance of Kinect sensor
        /// </summary>
        private KinectSensor _kinect;

        /// <summary>
        /// Body reader
        /// </summary>
        public BodyFrameReader _bodyReader;

        /// <summary>
        /// Collection of all tracked bodies
        /// </summary>
        public Body[] _bodies;

        /// <summary>
        /// Requested face features
        /// </summary>
        private const FaceFrameFeatures _faceFrameFeatures = FaceFrameFeatures.BoundingBoxInInfraredSpace
                                                            | FaceFrameFeatures.PointsInInfraredSpace
                                                            | FaceFrameFeatures.MouthMoved
                                                            | FaceFrameFeatures.MouthOpen
                                                            | FaceFrameFeatures.LeftEyeClosed
                                                            | FaceFrameFeatures.RightEyeClosed
                                                            | FaceFrameFeatures.LookingAway
                                                            | FaceFrameFeatures.Happy
                                                            | FaceFrameFeatures.FaceEngagement
                                                            | FaceFrameFeatures.Glasses;

        /// <summary>
        /// Face Source
        /// </summary>
        private FaceFrameSource _faceSource;

        /// <summary>
        /// Face Reader
        /// </summary>
        private FaceFrameReader _faceReader;
        object[] kdata = new Object[8];

        public delegate void NextPrimeDelegate();
        /// <summary>
        /// Default CTOR
        /// </summary>
        public MainWindow1(MainWindow thread)
        {
            update = thread;
            //Initialize();
            // Initialize Leap Motion
            //InitializeLM();
        }

        public MainWindow1()
        {
            // TODO: Complete member initialization
        }

        public void DoWork()
        {
            // Initialize Components
            //update.InitializeComponent();
            //this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                     // (ThreadStart)delegate()
                     // {
                          update.InitializeComponent();
                     // }
                      //  );

            // Initialize Kinect
            InitializeKinect();
        }


        #region CAMERA
        #endregion CAMERA


        #region Kinect Code

        /// <summary>
        /// Initialize Kinect
        /// </summary>
        private void InitializeKinect()
        {
            //this if statement makes sure that this method is running in a thread
            //separate from the main thread.
            /*if (Dispatcher.Thread == System.Threading.Thread.CurrentThread)
            {
                System.Threading.ThreadStart threadStart = new System.Threading.ThreadStart(InitializeKinect);
                System.Threading.Thread newThread = new System.Threading.Thread(threadStart);
                newThread.Start();
                return;
            }*/

            kdata[0] = new Object();
            kdata[0] = new Object();
            kdata[0] = new Object();
            kdata[0] = new Object();
            kdata[0] = new Object();
            kdata[0] = new Object();
            kdata[0] = new Object();
            kdata[0] = new Object();

            // Get Kinect sensor
            _kinect = KinectSensor.GetDefault();

            if (_kinect == null) return;

            // Initialize Camera
            InitializeCamera();

            // Initialize body tracking
            InitializeBodyTracking();

            //Task.Factory.StartNew(_kinect.Open);
            //Task.WaitAll();
            _kinect.Open();

            // Start receiving
            //_kinect.Open();

        }

        #endregion
    }
}

0 个答案:

没有答案