9

新しい Kinect SDK v1.0.3.190 で遊んでいます。(stackoverflow のその他の関連する質問は、kinect の以前の SDK に関するものです) Kinect から深度と色のストリームを取得します。深度と RGB ストリームが異なるセンサーでキャプチャされるため、以下に示すように 2 つのフレーム間にずれがあります。

RGBのみ RGB

奥行きのみ 深さ

深度とRGB RGB と深度を均等にブレンド

それらを揃える必要があり、まさにこの目的のために MapDepthToColorImagePoint という名前の関数があります。しかし、うまくいかないようです。以下は、次のコードで作成された、均等にブレンドされた (深度とマッピングされた色) 結果です。

            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]));
        });

どこ

depthFrameData -> raw depth data (short array)

videoBitmapData -> raw image data (byte array)

mappedBitmapData -> expected result data (byte array)

パラメーターの順序、解像度、配列サイズが正しい (二重チェック)。

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

ズレが続く!さらに悪いことに、MapDepthToColorImagePoint を使用した後の結果の画像は元の画像とまったく同じです。

誰かが私の間違いを見つけるのを手伝ってくれるか、少なくとも MapDepthToColorImagePoint が何のためのものかを説明してくれれば幸いです (私がその機能を誤解していると仮定して)。

4

2 に答える 2

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のグリーンスクリーンの例を見ると、これの良い使い方がわかります。

于 2012-10-30T02:50:31.040 に答える
1

これは非常に一般的な問題で、2 台のカメラが 2 つの異なる場所にあるため、2 つの画像を同期するための数学に固有のものです。3D カメラで生成された 2 つのビデオ フィードを取得し、それらを同期しようとするようなものです。それらは常にわずかにずれます。

修正のための 2 つのアイデア:

  1. 深度画像を計算するときに、手動で深度画像からビットをシフトします。
  2. Kinect にシェーカー モーターを追加してノイズを減らし ます

MapDepthToColorImagePoint は Skeletal API で使用され、骨格ポイントを深度ポイントにマッピングしてから画像ポイントにマッピングし、RGB 画像の上にジョイントを表示できるようにします。

お役に立てれば。

于 2012-05-07T18:06:17.983 に答える