0

骨格追跡用の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);
4

2 に答える 2

2

次の手順を試してください。

  • テスト用に scaleTo() の行にコメントを付けます。
  • kinect を 640x480 で初期化しましたか? このサイズを XAML の my:KinectSkeletonViewer 要素に配置してみてください。実際は Width="320" Height="240" であることがわかりました。変更します。
  • また、イメージ要素またはそれをホストするキャンバスでストレッチを使用しないように確認してください。セキュリティのために、MainCanvas から Height="Auto" と Width="Auto" を削除してください。
  • TransformSmoothParameterなしでスケルトン ストリームを開始するか、これを使用する場合は、次のパラメーターを試してください。

    this.KinectSensorManager.TransformSmoothParameters = new TransformSmoothParameters
    {
        Smoothing = 0.5f,
        Correction = 0.5f,
        Prediction = 0.5f,
        JitterRadius = 0.05f,
        MaxDeviationRadius = 0.04f
    };
    

私はあなたがxbox用のkinectを使用してやろうとしているのと同じことをしています.それは私にとってはうまくいきました. channel9 ビデオが記録されたとき、sdk には CoordinateMapper クラスがなかったため、深度に変換してから色に変換する必要はありません。座標マッパーには、スケルトン ポイントをカラー ポイントに直接マップするメソッドがあり、そのメソッドは MapSkeletonPointToColorPoint( )、メソッドを使用し、深度データについて心配しないでください。

于 2012-11-30T16:01:34.680 に答える
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" />

画像オブジェクトに変化をもたらしたのは、プロパティまたはイベントの設定が間違っていたか、まったく設定されていなかった可能性があります。

于 2012-12-03T00:16:26.573 に答える