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 事件并在该事件中处理新帧。
将 Form1() 构造函数中的代码更改为如下所示:
public Form1()
{
InitializeComponent();
controller.EventContext = WindowsFormsSynchronizationContext.Current;
controller.FrameReady += getXYZValues;
}
然后更改您的 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
它帮助我开始使用我的代码并提供了这个问题的答案。
希望对你有帮助。
我想做的是使用 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 事件并在该事件中处理新帧。
将 Form1() 构造函数中的代码更改为如下所示:
public Form1() { InitializeComponent(); controller.EventContext = WindowsFormsSynchronizationContext.Current; controller.FrameReady += getXYZValues; }
然后更改您的 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 它帮助我开始使用我的代码并提供了这个问题的答案。 希望对你有帮助。