2016-03-21 23 views
-2

私のKINECT v2の右のハンドティップ位置を使用してキャンバスに線を描こうとしています。私は、このコード行から右手の先端位置を取得しています。Kinect v2を使用して線を描くc#wpf

CameraSpacePoint handtipPosition = handtip.Position; 
ColorSpacePoint handtipPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(handtipPosition); 

、これは線を描画するための私のコードスニペットで、私は私は、座標を割り当てるためPreviousPointを使用する場合、X1及びY1はそう

ColorSpacePoint PreviousPoint; 

     line.X1 = PreviousPoint.X; // ERROR 'Use of possibly Unassigned field X' 
     line.Y1 = PreviousPoint.Y; // ERROR 'Use of possibly Unassigned field Y' 
     line.X2 = handtipPoint.X;         
     line.Y2 = handtipPoint.Y;        
     PreviousPoint = handtipPoint;       
     canvas.Children.Add(line); 

として私のラインに座標なく供給する別のポイントを定義しています私のX1とY1のパラメータ私はエラーが発生する可能性があります未使用のフィールドXを使用して(私は推測している原因は、PreviousPointは最初に値がありません)と私のキャンバス私は描く上でXとYのpreviousPoint値を0に修正X2とY2だけが私の手の位置に続くように、固定点(0,0)からの線。

私はこの状況を修正する助けてください、何か提案とお手伝いをよろしくお願いします。

+0

あなたが投稿した少しのコードから、エラーは正しいです:ローカル変数 'PreviousPoint'を宣言し、それを初期化する前にそれを使用しようとしました。良い[mcve]がなければ、修正する必要があることは本当に明確ではありません。以前のポイントが必要な場合は、変数を最後に長くなるような場所(インスタンスフィールドなど)に置き、_once_で初期化してから2つの異なるポイントを受け取るまで線を描画しないでください。私はこの質問がKinectとは何の関係がないのか分かりません。あなたがKinect APIからポイントを得ているのは実際の質問に接しているようです。 –

+0

私は前回の値を最初に初期化したいのは、最初に値がないためです。しかし、イベントハンドラが起動すると、kinectセンサはジョイント位置に給電し、最終的には先行点を埋めるでしょう。 それまでは、インスタンス化したいだけです。ただ1回だけ、nullオブジェクトエラーが表示されません。 – Sda

答えて

0

それは正確な問題はここにあるものはまだ私にははっきりしていません。しかし、他の答えに対するあなたのコメントに基づいて、それは1時間前に私のコメントからの私の推測がマークにあるかもしれないようです。その場合には、このような何かがあなたのために働く必要があります。

class Form1 : Form // making assumption your code is in a Form 
{ 
    ColorSpacePoint? PreviousPoint; 

    // I have no idea what the actual event handler is supposed to look like. 
    // This is just a wild guess based on the little bit of code you posted. 
    void KinectEventHandler(object sender, KinectEventArgs handtip) 
    { 
     CameraSpacePoint handtipPosition = handtip.Position; 
     ColorSpacePoint handtipPoint = _sensor.CoordinateMapper 
      .MapCameraPointToColorSpace(handtipPosition); 

     if (PreviousPoint != null) 
     { 
      ColorSpacePoint previousPointValue = (ColorSpacePoint)PreviousPoint; 
      line.X1 = previousPointValue.X; 
      line.Y1 = previousPointValue.Y; 
      line.X2 = handtipPoint.X;         
      line.Y2 = handtipPoint.Y;        
      canvas.Children.Add(line); 
     } 
     PreviousPoint = handtipPoint;       
    } 
} 

上記のイベントハンドラメソッドの外に、ColorSpacePointの「NULL可能」インスタンスを宣言します。既定ではnullに初期化されます。イベントハンドラでは、この値がまだヌルでない場合にのみが追加されます。、つまり初期ポイントがすでに受信されています。いずれの場合も、現在の値はPreviousPointの現在の値に置き換えられます。その値は、次にイベントハンドラが呼び出されるときに使用されます。

ColorSpacePointは実際には値タイプ(つまり、struct)であると仮定しています。私はあなたが表示するエラーメッセージからこれを推測しています。値の型だけから来てください。しかし、参照型(class)の場合、参照型はすでにnull可能であるため、フィールドを「nullable」型として宣言する必要はありません。その場合、フィールドをColorSpacePoint PreviousPointと宣言し、そのフィールドをローカルに最初にコピーするのではなく、そのフィールドを直接使用してください(例:line.X1 = PreviousPoint.X;)。

(実際には、とにかくそれをローカルの最初にコピーする必要はありません...例えばPreviousPoint.Value.Xを使用できますが、複数のフィールドにアクセスしているため、わかりやすくするためにローカル変数に移動したいnull可能な型へのアクセスを減らすため)。

+0

ありがとう、ピーター!これは問題を解決しました!私は十分な情報を提供してくれなかったことを申し訳なく思っています。私はwpfを使用しています。はいColorSpacePointはセンサーから供給されるxとyの値を持つ構造体です。これは、インスタンス化の問題を解決し、今私のキャンバスに描画することができます。私は現在、座標を正しく取得しようとしています。おかげさまで、本当にありがとうございました。非常に役立っています! @Nobody、ありがとうございました – Sda

+0

あなたが答えを見つけてくれてうれしいです。私があなたに尋ねようとしていたことのより良いアイデアを得ました:)私はコード例がより良い詳細を提供するようにあなたの投稿を編集して戻すことを提案します。あなたが質問したときに持っていたイベントハンドラメソッド全体を表示し、コードを2つの別々の部分に分割するのではなく、 'PreviousPoint'変数の宣言のコンテキストを明示的に表示することが特に重要ですメソッドシグニチャーそのもの。それは疑問をより明確にするために長い道のりになります。 –

0

私は、線を描画するコードがKINECTのイベントハンドラにあると仮定していますか?その場合は、グローバルスコープでPreviousPointオブジェクトをインスタンス化するだけです。

明らかに、これは擬似コードです。これは実際のコードを追加することなく可能です。これにより、nullオブジェクトを取得できなくなります。イベントハンドラで値が上書きされないため、値を適切に更新して線を描画する必要があります。

これらの記事にも役立つことがあります。

understanding-kinect-coordinate-mapping/

kinect-painting-c-wpf-sdk-kinect

+0

これは非常にうまく答えています。コードは、ボディフレームが取得され、ジョイントポジションが入力されるKinectのイベントハンドラ内にあります。あなたは私の問題を理解しています。私はソリューションがうまくいくはずですが、そのようなものとして、Previouspointをインスタンス化するための行。 'public partial class MainWindow:Window { private ColorSpacePoint PreviousPoint; PreviousPoint.X = 0; PreviousPoint.Y = 0; ' //他のイベントハンドラとメンバ変数の宣言が続きます クラス構造体またはインターフェイスメンバで無効なトークン '='をもう一度返すエラーが発生しました。 – Sda

+0

@Sda:答えの作成者が有効なC#コードを書くのは面倒ではないので、コンパイラエラーが発生しています。上記の無効なコードをコンパイルするものに翻訳するには、独自のC#の知識を使用するか、作成者が解答を修正するのを待って待ってください。 –

+0

はい、申し訳ありませんが、C#の新機能はまだわかりましたが、建設的なフィードバックは高く評価されています。修正するためにエラーを探しています。私はNobodyの提案された解決策を理解しており、それを完全に理解し、現在実装してエラーを回避しようとしています。ありがとう@Peter。 – Sda

関連する問題