Kinect V2的手势跟踪技术详解

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; } } } } }

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485