我正在实现一个可以跟踪用户轮换的WPF应用程序。其他想法是将kinect置于一个恒定的位置。用户来到kinect前面,他/她可以旋转360度。我想跟踪用户旋转的度数。我使用以下方法来跟踪它。但似乎功能不准确,当用户面对0度时,它显示为180,并且它也给出负值。
public static double GetShoulderRotation(this Skeleton skeleton)
{
Joint leftShoulder = skeleton.Joints[JointType.ShoulderLeft];
Joint rightShoulder = skeleton.Joints[JointType.ShoulderRight];
if (leftShoulder.TrackingState == JointTrackingState.NotTracked ||
rightShoulder.TrackingState == JointTrackingState.NotTracked)
{
return Double.NaN;
}
else
{
return (Math.Atan2(
rightShoulder.Position.Z - leftShoulder.Position.Z,
leftShoulder.Position.X - rightShoulder.Position.X)*180.0/Math.PI);
}
}
有人可以为此提供解决方案吗?
答案 0 :(得分:1)
我建议在hipcenter和spine之间使用骨骼旋转。当一个人站在Kinect的正面时,Hipcenter.Z-Spine.Z是积极的。当一个人侧身站立并面向左侧时,Hipcenter.X-Spine.X为负值。使用X和Z值,可以很容易地计算旋转角度。正弦肩关节可能被Kinect的身体其他部位阻塞,我选择了臀部中心到脊柱的骨骼,它可以很好地跟踪我身体的旋转。
答案 1 :(得分:0)
尝试使用深度而不是计算度数。首先检测右肩和左肩之间的距离(X轴)。然后在此距离和角度之间创建一个比例。如果距离(我的意思是右肩和左肩之间的距离)是最大值和正值,则角度为0.如果距离为最大值且为负值,则角度为180.如果距离为max / 2且为正,则角度是45。
答案 2 :(得分:0)
我知道这是一个老问题,但我最近一直在努力解决同样的问题。我写了一个可以跟踪两个关节之间旋转角度的函数。我尝试过左右臀部,对我来说效果很好。 Mabe对其他人有帮助。
一件事是它适用于旋转角度<双向70度。如果角度较大,则难以适当地跟踪它。
这是我的解决方案。
protected double TrackJointsRotation(KinectSensor sensor, Joint joint1, Joint joint2)
{
if (joint1.TrackingState == JointTrackingState.NotTracked
|| joint2.TrackingState == JointTrackingState.NotTracked)
return double.NaN;
var rightHip = sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(joint1.Position, sensor.DepthStream.Format);
var leftHip = sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(joint2.Position, sensor.DepthStream.Format);
return (Math.Atan(((double)rightHip.Depth - leftHip.Depth) / ((double)leftHip.X - rightHip.X)) * 180.0 / Math.PI);
}