C # - не получает данные Leap Motion без события клика - PullRequest
0 голосов
/ 26 июня 2018

я пытаюсь получить данные для отслеживания рук с помощью Leap motion и отобразить их в форме C #. Я смог сделать это одним нажатием кнопки.

Теперь я не хочу, чтобы данные нажимались на кнопку, а всякий раз, когда я запускаю код, они должны отображаться в графическом интерфейсе.

Итак, я переместил свой код из события click в метод, и я вызываю этот метод из констурктора по умолчанию.

Что я заметил, так это когда я записываю фиктивные значения в tetbox вручную, это работает ... но не иначе.

Вот мой код:

namespace HandTrackOldSDK
{
    public partial class Form1 : Form
    {
        // Initialize the Controller object which connects to the Leap motion service
        // and captures the hand tracking data
        private Controller controller = new Controller();
        System.Threading.SynchronizationContext uiContext;

        public Form1()
        {
            uiContext = WindowsFormsSynchronizationContext.Current;
            InitializeComponent();
            getXYZVlaues();
        }


        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();            
        }


        private void getXYZVlaues()
        {

               //Get the most recent tracking data using the Frame object
               Frame frame = controller.Frame();

                   for (int h = 0; h < frame.Hands.Count; h++)
                   {                       
                       Hand leapHand = frame.Hands[h];

                       Finger leapFinger = leapHand.Fingers[1];

                       Vector currentPosition = leapFinger.StabilizedTipPosition;

                      textBox1.Text = Convert.ToString(currentPosition.x);
                     textBox2.Text = Convert.ToString(currentPosition.y);
                     textBox3.Text = Convert.ToString(currentPosition.z); 
                   }
        }
    }
}

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 29 июля 2018

Исходя из вашего кода, я думаю, вам нужно добавить событие FrameReady в ваш объект контроллера и обработать новые кадры в этом событии.

  1. Измените свой код в конструкторе Form1 (), чтобы он выглядел следующим образом:

    public Form1()
    {      
      InitializeComponent();
      controller.EventContext = WindowsFormsSynchronizationContext.Current;
      controller.FrameReady += getXYZValues;
    }
    
  2. Затем измените ваш метод getXYZValues ​​(), чтобы иметь аргументы object и FrameEventArgs и получить новый кадр из объекта FrameEventArgs:

    private void getXYZValues(object sender, FrameEventArgs eventArgs)
    {
    
      //Get the most recent tracking data using the Frame object
      Frame frame = eventArgs.frame;
    
      for (int h = 0; h < frame.Hands.Count; h++)
      {
        Hand leapHand = frame.Hands[h];
    
        Finger leapFinger = leapHand.Fingers[1];
    
        Vector currentPosition = leapFinger.StabilizedTipPosition;
    
        textBox1.Text = Convert.ToString(currentPosition.x);
        textBox2.Text = Convert.ToString(currentPosition.y);
        textBox3.Text = Convert.ToString(currentPosition.z);
     }
    

    }

Это сработало для меня, отображая значения X, Y и Z в трех текстовых полях, которые менялись каждый раз, когда я двигал пальцами. Обратите внимание, что устройство Leap Motion очень чувствительно и улавливает все ваши мелкие тенденции дрожания рук, поэтому не удивляйтесь, что значения быстро меняются и редко устанавливаются на постоянное число.

Посмотрите на эту страницу: https://developer -archive.leapmotion.com / Документация / csharp / devguide / Project_Setup.html Это помогло мне начать работу с кодом и дать ответ на этот вопрос. Надеюсь, это поможет.

...