【发布时间】:2012-11-30 08:40:02
【问题描述】:
当我运行 Channel9 MSDN Kinect 快速入门系列代码进行骨骼跟踪时,假设存在与所选关节位置重叠的图像/椭圆。相反,我得到的图像/椭圆稍微偏离了关节的位置,而不是完全超出了关节的位置。无论我将关节移动到哪里,图像都会远离关节的确切位置。我在这里看过视频(http://channel9.msdn.com/Series/KinectQuickstart/Skeletal-Tracking-Fundamentals)和他们的作品。是否有什么我做错了我没有注意到我更改或忘记更新的地方?
更新: 这是可能导致它的某些代码行:
CoordinateMapper cm = new CoordinateMapper(kinectSensorChooser1.Kinect);
//Map a joint location to a point on the depth map
//head
DepthImagePoint headDepthPoint =
cm.MapSkeletonPointToDepthPoint(first.Joints[JointType.Head].Position, depth.Format);
这是对视频内容的更改,因为他们更新了一种将骨架映射到深度和深度到色点的新方法。它消除了流终止时发生的错误。 该方法具有要求位置和格式的参数。难道是depth.Format和RGB640x480Resolution的格式不一样?
//Map a depth point to a point on the color image
//head
ColorImagePoint headColorPoint =
cm.MapDepthPointToColorPoint(depth.Format, headDepthPoint,
ColorImageFormat.RgbResolution640x480Fps30);
在主窗口屏幕上,这是我用于创建我正在使用的图像的内容:
<Canvas Name="MainCanvas">
<my:KinectColorViewer Canvas.Left="50" Canvas.Top="50" Height="480" Name="kinectColorViewer1" Width="640"
Kinect="{Binding ElementName=kinectSensorChooser1, Path=Kinect}" />
<Ellipse Canvas.Left="0" Canvas.Top="0" Height="50" Name="leftEllipse" Width="50" Fill="#FF4D298D" Opacity="1" Stroke="White"></Ellipse>
<Ellipse Canvas.Left="100" Canvas.Top="0" Height="50" Name="rightEllipse" Stroke="White" Width="50" Fill="#FF2CACE3" Opacity="1" />
<my:KinectSensorChooser Canvas.Left="250" Canvas.Top="380" Name="kinectSensorChooser1" Width="328" />
<Ellipse Canvas.Left="225" Canvas.Top="84" Height="50" Name="headImage" Stroke="White" Width="50" Fill="#FF2CACE3" Opacity="1" />
<my:KinectSkeletonViewer Canvas.Left="646" Canvas.Top="240" Name="kinectSkeletonViewer1" Width="640" Height="480" Kinect="{Binding ElementName=kinectSensorChooser1, Path=Kinect}" />
</Canvas>
我已经注释了这些关于缩放位置的代码行
//ScalePosition(headImage, first.Joints[JointType.Head]);
// ScalePosition(leftEllipse, first.Joints[JointType.HandLeft]);
//ScalePosition(rightEllipse, first.Joints[JointType.HandRight]);
并且这个函数已经被注释掉了。
private void ScalePosition(FrameworkElement element, Joint joint)
{
//convert the value to X/Y
//Joint scaledJoint = joint.ScaleTo(1280, 720);
//convert & scale (.3 = means 1/3 of joint distance)
// Joint scaledJoint = joint.ScaleTo(1280, 720, .3f, .3f);
// Canvas.SetLeft(element, scaledJoint.Position.X);
// Canvas.SetTop(element, scaledJoint.Position.Y);
}
这被注释掉了,所以没有使用转换参数: //sensor.SkeletonStream.Enable(参数);
这就是启用流和框架的代码行的样子:
sensor.SkeletonStream.Enable();
sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(sensor_AllFramesReady);
sensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
【问题讨论】:
-
您是否完全修改了代码(如果有,请包括在内)?您使用的是适用于 Windows 的 Kinect 还是 Xbox 369 Kinect?你的屏幕分辨率是多少?
-
嘿@Evil Closet Monkey Windows 和 Xbox Kinect 在骨骼跟踪方面有什么不同吗?
-
我不能 100% 确定是否有。 Xbox Kinect 不支持近距离模式,但这可能只是微软为了防止人们购买更便宜的版本(可能)而考虑的硬件开关。在线没有明确的细分可以涵盖两种硬件之间的所有技术差异。我只是试图捕捉原始项目和@user1773489 的项目之间的所有潜在差异,以查看可能导致问题的原因。
-
我正在使用 Xbox 360 Kinect。 RGB 分辨率为 640x480。
标签: kinect