作为旁注,这个问题与SharpDX无关,它纯粹是一个Kinect 2.0 SDK问题。
我正在将已完成的Kinect 1.8项目迁移到Kinect 2.0 SDK。在这个程序中,我有一个WPF前端,但99%的代码是用SharpDX for C#编写的。程序隐藏KinectRegions光标并使用光标位置和夹点数据作为SharpDX代码的输入。然而,使用这个新版本的Kinect SDK,我找不到任何方法来获取相对光标数据(相对于用户的手位置)。我尝试使用骨架数据来推断光标位置,只是一个简单的主肩位置 - 主手位置。这有一个问题,当手遮住肩膀时,光标会射击。如果我在遮挡发生时通过脊柱反射来切换肩膀,我会瞬间跳跃。我可以想办法让它工作,但需要相当多的代码。在我深入研究之前,我想确保没有别的办法。在此先感谢您的帮助!
答案 0 :(得分:0)
你应该看看Mike Taulty's blog。他利用KinectCoreWindow抓住指针移动。但需要注意的是:即使他们没有“活跃”,这个事件也会被提升。我通过利用身体框架来设置哪一只手更高(y)来表示那只手是“活跃的”来缓解这种情况。
...
var window = KinectCoreWindow.GetForCurrentThread();
window.PointerMoved += window_PointerMoved;
...
void window_PointerMoved(object sender, KinectPointerEventArgs e)
{
if ((!rightHand && e.CurrentPoint.Properties.HandType == HandType.LEFT) ||
(rightHand && e.CurrentPoint.Properties.HandType == HandType.RIGHT))
{
//do something with this hand pointer's location
}
}
void _bodyReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
//get and check frame
//...
using (frame)
{
frame.GetAndRefreshBodyData(_bodies);
foreach(Body body in _bodies)
{
if(body.IsTracked)
{
CameraSpacePoint left = body.Joints[JointType.HandLeft].Position;
CameraSpacePoint right = body.Joints[JointType.HandRight].Position;
if (left.Y > right.Y)
rightHand = false;
else
rightHand = true;
break; //for this example I'm just looking at the first
//tracked body - other handling is required if you
//want to keep track of more than one body's hands
}
}
}
}
另一部分是你以前的应用程序可以隐藏KinectRegion游标;我还没有发现如何用Kinect v2做到这一点(这让我对这个问题实际上大笑)。