我正在尝试开发一个似乎是一个简单的程序,它使用Kinect for Xbox360来计算一个人的行进距离。 Kinect将指向的房间将是10 x 10.用户按下按钮后,主体将在此空间内移动。一旦主体到达该区域的最终目的地,用户将再次按下该按钮。然后,Kinect将输出主体在两次按钮之间行进的距离。从来没有为Kinect开发过,开始这一点非常艰巨。我的问题是我不完全确定我应该用什么来衡量距离。在我的研究中,我已经找到了计算物体距离Kinect的距离的方法,但这是关于它的。
答案 0 :(得分:0)
你所听到的是一个处理笛卡尔平面的简单问题。 Kinect在XYZ空间中有20个关节,距离以米为单位。为了访问这些关节,你可以在“Tracker”类中包含这些语句(这是C#......不确定你是否在SDK中使用C#或C ++):
public Tracker(KinectSensor sn, MainWindow win, string fileName)
{
window = win;
sensor = sn;
try
{
sensor.Start();
}
catch (IOException)
{
sensor = null;
MessageBox.Show("No Kinect sensor found. Please connect one and restart the application", "*****ERROR*****");
return;
}
sensor.SkeletonFrameReady += SensorSkeletonFrameReady; //Frame handlers
sensor.ColorFrameReady += SensorColorFrameReady;
sensor.SkeletonStream.Enable();
sensor.ColorStream.Enable();
}
这些访问来自Kinect的颜色和骨架流。骨架流包含关节,因此您可以使用以下语句关注它:
//Start sending skeleton stream
private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
//Access the skeleton frame
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
//Check to see if there is any data in the skeleton
if (this.skeletons == null)
//Allocate array of skeletons
this.skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
//Copy skeletons from this frame
skeletonFrame.CopySkeletonDataTo(this.skeletons);
//Find first tracked skeleton, if any
Skeleton skeleton = this.skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();
if (skeleton != null)
{
//Initialize joints
///<summary>
///Joints to be displayed, projected, recorded, etc.
///</summary>
Joint leftFoot = skeleton.Joints[JointType.FootLeft];
}
}
所以,在你的程序开始时,你想要选择一个关节(有20个......选择一个在你执行程序时总是面向Kinect的一个)并获得它的位置类似于以下陈述:
if(skeleton.Joints[JointType.FootLeft].TrackingState == JointTrackingState.Tracked)
{
double xPosition = skeleton.Joints[JointType.FootLeft].Position.X;
double yPosition = skeleton.Joints[JointType.FootLeft].Position.Y;
double zPosition = skeleton.Joints[JointType.FootLeft].Position.Z;
}
最后,您需要在停止流之前稍微延迟...在点击之间和从Kinect关闭流之间的某个时间。然后,您将进行数学运算以获得两点之间的距离。如果你没有延迟,你将无法获得笛卡尔点。