当我运行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(parameters);
这就是使用流和骨架启用代码行的内容:
sensor.SkeletonStream.Enable();
sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(sensor_AllFramesReady);
sensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
答案 0 :(得分:2)
请尝试以下步骤。
使用否 TransformSmoothParameter启动骨架流,或者,如果要使用此功能,请尝试以下参数
this.KinectSensorManager.TransformSmoothParameters = new TransformSmoothParameters
{
Smoothing = 0.5f,
Correction = 0.5f,
Prediction = 0.5f,
JitterRadius = 0.05f,
MaxDeviationRadius = 0.04f
};
我正在尝试使用kinect for xbox,它对我来说很好。 当录制了channel9视频时,sdk没有CoordinateMapper类,所以,你不需要转换为深度然后转换为颜色,坐标映射器有一个方法直接将骨架点映射到颜色点,方法是MapSkeletonPointToColorPoint( ),使用该方法,不要担心深度数据。
答案 1 :(得分:0)
看起来我在xaml代码中遇到的问题。我替换了我的xaml代码,并将其替换为我画布上图像和对象的原始xaml代码。
<my:KinectColorViewer Canvas.Left="0" Canvas.Top="0" Width="640" Height="480" Name="kinectColorViewer1"
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 Canvas.Left="100" Canvas.Top="0" Fill="#FF2CACE3" Height="50" Name="rightEllipse" Width="50" Opacity="1" Stroke="White" />
<my:KinectSensorChooser Canvas.Left="250" Canvas.Top="380" Name="kinectSensorChooser1" Width="328" />
<Image Canvas.Left="66" Canvas.Top="90" Height="87" Name="headImage" Stretch="Fill" Width="84" Source="/SkeletalTracking;component/c4f-color.png" />
这可能是我设置不正确的属性或事件设置,或者根本没有引入图像对象的移位。