骨格追跡用のChannel9MSDNKinectクイックスタートシリーズコードを実行すると、選択した関節の位置と重なる画像/楕円があると思われます。代わりに、わずかにずれていて、関節の位置を正確に超えていない画像/楕円が表示されます。関節をどこに動かしても、画像は関節の正確な位置の横にとどまります。私はここのビデオ(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);
これは、スケルトンを深度に、深度をカラーポイントにマッピングする新しい方法で更新されたため、ビデオの内容が変更されたものです。ストリームが終了したときに発生したエラーを排除します。このメソッドには、位置と形式を要求するパラメーターがあります。深さのフォーマットが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);