目标:同时从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
}
}