2012-04-30 11 views
8

私は新しいKinect SDK v1.0.3.190で遊んでいます。 (stackoverflowの他の関連する質問は、kinectの以前のsdkにあります) Kinectから深みと色の流れが得られます。深さおよびRGBストリームが異なるセンサで取り込まれると、以下に示すように、2つのフレームの間にミスア​​ライメントが存在します。Kinectの奥行きと画像フレームのアライメント

のみRGB RGB

深さだけ Depth

深& RGB RGB & Depth equally blended

私はそれらを合わせる必要があり、この目的のために、正確にMapDepthToColorImagePointという名前の関数があります。しかし、それは動作していないようです。ここで(深さおよびマッピングされた色)次のコードのパラメータ、解像度、アレイサイズの

depthFrameData -> raw depth data (short array) 

videoBitmapData -> raw image data (byte array) 

mappedBitmapData -> expected result data (byte array) 

順序が正しい

  Parallel.For(0, this.depthFrameData.Length, i => 
     { 
      int depthVal = this.depthFrameData[i] >> 3; 
      ColorImagePoint point = this.kinectSensor.MapDepthToColorImagePoint(DepthImageFormat.Resolution640x480Fps30, i/640, i % 640, (short)depthVal, ColorImageFormat.RgbResolution640x480Fps30); 
      int baseIndex = Math.Max(0, Math.Min(this.videoBitmapData.Length - 4, (point.Y * 640 + point.X) * 4)); 

      this.mappedBitmapData[baseIndex] = (byte)((this.videoBitmapData[baseIndex])); 
      this.mappedBitmapData[baseIndex + 1] = (byte)((this.videoBitmapData[baseIndex + 1])); 
      this.mappedBitmapData[baseIndex + 2] = (byte)((this.videoBitmapData[baseIndex + 2])); 
     }); 

で作成された下に生じる等しくブレンドする(ダブルチェック) 。

コードの結果は次のとおりです。 depth and MapDepthToColorImagePoint

ずれが続きます!さらに悪いのは、MapDepthToColorImagePointを使用した後の結果イメージが元のイメージとまったく同じことです。

誰かが私の間違いを知る助けになるか、少なくともMapDepthToColorImagePointについて教えてください(その機能を誤解していると仮定して)。

答えて

1

これは非常に一般的な問題です.2台のカメラが2つの異なる場所に座っているため、2つの画像を同期させる数学に固有の何かがあります。 3Dカメラで生成された2つのビデオフィードを取得し、それらを同期しようとするようなものです。彼らはいつも少し離れているでしょう。補正のための

つのアイデア:

  1. 手動でそれを計算して奥行き画像からビットをシフト。
  2. は、ノイズを低減するためのKinectにシェーカーモーターを追加します。 http://www.youtube.com/watch?v=CSBDY0RuhS4(。私は、単純なページャモータが有効であることが判明している)

MapDepthToColorImagePointがに、骨格のポイントをマップするために骨格APIで使用するためのものです奥行きポイント、次にイメージポイントに移動し、RGBイメージの上にジョイントを表示することができます。

これが役に立ちます。

4

これは、2つのセンサーがわずかに異なる場所に取り付けられているため、常にわずかに発生します。

はそれを試してみてください:あなたの両眼を持ついくつかのオブジェクトで

ルックを、そして唯一のあなたの左目は、あなただけの右目を使用してみてください。あなたの2つの目がまったく同じ場所にないので、物は少し違って見えます。

ただし、いくつかのAPIコードで多くの問題を修正することは可能です。

私はKinect for Windows 1.5を使用しています。そのため、APIは1.0と少し異なります。

short[] depth=new short[320*240]; 
// fill depth with the kinect data 
ColorImagePoint[] colorPoints=new ColorImagePoint[320*240]; 
// convert mappings 
kinect.MapDepthFrameToColorFrame(DepthImageFormat.Resolution320x240Fps30, 
      depth, ColorImageFormat.RgbResolution640x480Fps30, colorPoints); 
// now do something with it 
for(int i=0;i<320*240;i++) 
{ 
    if (we_want_to_display(depth[i])) 
    { 
    draw_on_image_at(colorPoints[i].X,colorPoints[i].Y); 
    } 
} 

これは基本です。 Kinect Developer Toolkit 1.5のグリーンスクリーンの例を見ると、これが有効です。

関連する問題