我正在尝试开发一个看似简单的程序,该程序使用 Xbox360 的 Kinect 来计算一个人行进的距离。Kinect 将指向的房间大小为 10 x 10。用户按下按钮后,对象将在该空间内移动。一旦对象到达该区域的最终目的地,用户将再次按下按钮。然后,Kinect 将输出受试者在两次按下按钮之间走了多远。以前从未为 Kinect 开发过,因此入门非常艰巨。我的问题是我不完全确定应该使用什么来测量距离。在我的研究中,我找到了计算物体与 Kinect 之间距离的方法,仅此而已。
问问题
1767 次
1 回答
0
你所听到的是一个处理笛卡尔平面的简单问题。Kinect 有 20 个关节存在于 XYZ 空间中,距离以米为单位。为了访问这些关节,您在“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 流式传输之间的一段时间。然后,您将进行计算以获得两点之间的距离。如果您没有延迟,您将无法获得笛卡尔点。
于 2013-06-05T19:38:42.120 回答