1

いくつかのオブジェクトを検出するために深度値にアクセスする単純なkinectアプリケーションを作成しました。次のコードを使用して深度値を取得します

depth = NuiDepthPixelToDepth(pBufferRun);

これにより、各ピクセルの深度値がわかります。次に、画像の領域をサブ選択して、この対応する領域のRGBカメラ値を取得します。

よくわからないこと:

  • カラー画像ストリームを開く必要がありますか?
  • それとも、深さを色に変換するだけで十分ですか?
  • どのように使用しNuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolutionますか?

デプスフレームとカラーフレームがある最も単純なソリューションで問題ないので、opencvでROIを選択し、それに応じてカラーフレームをトリミングできます。

4

1 に答える 1

2
  • カラー画像ストリームを開く必要がありますか?

はい。ストリームを開かなくてもカラーフレームの座標を取得できますが、インデックスを作成するカラーデータがないため、それらを使用して有用なことを行うことはできません。

  • それとも、深さを色に変換するだけで十分ですか?

距離から色への意味のある変換はありません。2つの画像ストリームと座標変換関数が必要です。

  • NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolutionを使用するにはどうすればよいですか?

それはひどく文書化された関数です。関数の引数とドキュメントは実際には意味があるので、代わりにNuiImageGetColorPixelCoordinatesFromDepthPixelAtResolutionを見てください。深度値と深度(x、y)座標が入力され、RGB(x、y)座標が出力されます。単純。

特定の座標でRGBデータを取得するには、最初にを使用してRGBフレームをNuiImageStreamGetNextFrame取得し、INuiFrameTextureインスタンスを取得する必要があります。LockRectを取得するには、これを呼び出しNUI_LOCKED_RECTます。このオブジェクトのpBitsプロパティは、生のXRGB画像の最初のピクセルへのポインタです。この画像は、上から下、左から右の順序で行ごとに保存されます。各ピクセルは、パディングバイトを表す4つの連続したバイトで表され、その後にR、G、Bが続きます。

(100, 200)したがって、位置のピクセルは

lockedRect->pBits[ ((200 * width * 4) + (100 * 4) ];

赤のチャネルを表すバイトは次のようになります。

lockedRect->pBits[ ((200 * width * 4) + (100 * 4) + 1 ];

これは標準の32ビットRGB画像形式であり、バッファは選択した画像操作ライブラリに自由に渡すことができます... GDI、WIC、OpenCV、IPLなど。

(注意...ピクセルバイトの順序が正しいかどうかは完全にはわかりません。XRGBだと思いますが、たとえばXBGRまたはBGRXの可能性があります。実際に返されるテストは簡単です)

于 2012-11-12T15:56:25.863 に答える