Kinect V2不仅能够跟踪人体的关节位置,还能进一步识别手和拇指的位置,甚至可以指定手的状态。
找到手或拇指的位置就像找到其他任何关节的位置一样。还记得之前使用的代码片段吗?以下是如何获取每只手的位置:
void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
var reference = e.FrameReference.AcquireFrame();
// Color
// 显示颜色流...
// Body
using (var frame = reference.BodyFrameReference.AcquireFrame())
{
if (frame != null)
{
canvas.Children.Clear();
_bodies = new Body[frame.BodyFrameSource.BodyCount];
frame.GetAndRefreshBodyData(_bodies);
foreach (var body in _bodies)
{
if (body != null)
{
if (body.IsTracked)
{
// 查找关节
Joint handRight = body.Joints[JointType.HandRight];
Joint thumbRight = body.Joints[JointType.ThumbRight];
Joint handLeft = body.Joints[JointType.HandLeft];
Joint thumbLeft = body.Joints[JointType.ThumbLeft];
}
}
}
}
}
}
显示这些关节很简单。只需调用之前创建的DrawPoint方法。在今天的例子中,稍微修改了源代码,以绘制不同的颜色:
// 查找关节
Joint handRight = body.Joints[JointType.HandRight];
Joint thumbRight = body.Joints[JointType.ThumbRight];
Joint handLeft = body.Joints[JointType.HandLeft];
Joint thumbLeft = body.Joints[JointType.ThumbLeft];
// 绘制手和拇指
canvas.DrawPoint(handRight);
canvas.DrawPoint(handLeft);
canvas.DrawPoint(thumbRight);
canvas.DrawPoint(thumbLeft);
目前,Kinect支持以下手的状态。它们是HandState枚举的一部分:
Open(打开)、Closed(闭合)、Lasso(套索)、Unknown(未知)、NotTracked(未跟踪)。需要注意的是,手的状态是身体对象的成员,与相应的手关节无关。以下是访问状态的方法:
if (body.IsTracked)
{
// 查找并绘制关节
// 查找右手状态
switch (body.HandRightState)
{
case HandState.Open:
break;
case HandState.Closed:
break;
case HandState.Lasso:
break;
case HandState.Unknown:
break;
case HandState.NotTracked:
break;
default:
break;
}
// 查找左手状态
switch (body.HandLeftState)
{
case HandState.Open:
break;
case HandState.Closed:
break;
case HandState.Lasso:
break;
case HandState.Unknown:
break;
case HandState.NotTracked:
break;
default:
break;
}
}
之后,简单地创建一些TextBlock元素(分别命名为tblRightHandState和tblLeftHandState),并更新了每只手的状态。以下是完整的源代码:
using (var frame = reference.BodyFrameReference.AcquireFrame())
{
if (frame != null)
{
canvas.Children.Clear();
_bodies = new Body[frame.BodyFrameSource.BodyCount];
frame.GetAndRefreshBodyData(_bodies);
foreach (var body in _bodies)
{
if (body != null)
{
if (body.IsTracked)
{
// 查找关节
Joint handRight = body.Joints[JointType.HandRight];
Joint thumbRight = body.Joints[JointType.ThumbRight];
Joint handLeft = body.Joints[JointType.HandLeft];
Joint thumbLeft = body.Joints[JointType.ThumbLeft];
// 绘制手和拇指
canvas.DrawPoint(handRight);
canvas.DrawPoint(handLeft);
canvas.DrawPoint(thumbRight);
canvas.DrawPoint(thumbLeft);
// 查找手的状态
string rightHandState = "-";
string leftHandState = "-";
switch (body.HandRightState)
{
case HandState.Open:
rightHandState = "Open";
break;
case HandState.Closed:
rightHandState = "Closed";
break;
case HandState.Lasso:
rightHandState = "Lasso";
break;
case HandState.Unknown:
rightHandState = "Unknown...";
break;
case HandState.NotTracked:
rightHandState = "Not tracked";
break;
default:
break;
}
switch (body.HandLeftState)
{
case HandState.Open:
leftHandState = "Open";
break;
case HandState.Closed:
leftHandState = "Closed";
break;
case HandState.Lasso:
leftHandState = "Lasso";
break;
case HandState.Unknown:
leftHandState = "Unknown...";
break;
case HandState.NotTracked:
leftHandState = "Not tracked";
break;
default:
break;
}
tblRightHandState.Text = rightHandState;
tblLeftHandState.Text = leftHandState;
}
}
}
}
}