C#-在没有点击事件的情况下不获取 Leap Motion 数据

C#- not getting Leap Motion data without click event

我想做的是使用 Leap motion 获取手部跟踪数据并显示在我的 C# 窗体上。我可以通过单击按钮来完成。

现在,我不想要点击按钮时的数据,而是每当我 运行 代码时它应该显示在 GUI 上。

所以我将我的代码从点击事件移动到一个方法,我从默认构造函数调用该方法。

我观察到的是,当我在 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); 
                   }
        }
    }
}

知道为什么会这样吗?

从您的代码来看,我认为您需要向控制器对象添加一个 FrameReady 事件并在该事件中处理新帧。

  1. 将 Form1() 构造函数中的代码更改为如下所示:

    public Form1()
    {      
      InitializeComponent();
      controller.EventContext = WindowsFormsSynchronizationContext.Current;
      controller.FrameReady += getXYZValues;
    }
    
  2. 然后更改您的 getXYZValues() 方法以具有对象和 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/documentation/csharp/devguide/Project_Setup.html 它帮助我开始使用我的代码并提供了这个问题的答案。 希望对你有帮助。