8

私のアプリケーションでは、Depth Basics Sample から取得した深度フレームと同様の深度フレームを取得しています。私が理解できないのは、画像に離散レベルがあるのはなぜですか? これらの深度値の突然の変化を何と呼ぶか​​わかりません。明らかに私の右手の半分はすべて黒く、左手はそのような 3 つのレベルに分かれているようです。これは何ですか?どうすれば削除できますか?

Kinect 深度の基本サンプル

KinectExplorer サンプル アプリを実行すると、次のような深度が得られます。これは、生の深度データから生成したい深度画像です。

Kinect エクスプローラー

Microsoft Kinect SDK の (v1.6) NuiApi と OpenCV を使用しています。次のコードがあります。

BYTE *pBuffer = (BYTE*)depthLockedRect.pBits; //pointer to data having 8-bit jump
USHORT *depthBuffer = (USHORT*) pBuffer; //pointer to data having 16-bit jump
int cn = 4;
this->depthFinal = cv::Mat::zeros(depthHeight,depthWidth,CV_8UC4); //8bit 4 channel
for(int i=0;i<this->depthFinal.rows;i++){
   for(int j=0;j<this->depthFinal.cols;j++){
      USHORT realdepth = ((*depthBuffer)&0x0fff); //Taking 12LSBs for depth
      BYTE intensity = (BYTE)((255*realdepth)/0x0fff); //Scaling to 255 scale grayscale
      this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 0] = intensity;
      this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 1] = intensity;
      this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 2] = intensity;
      depthBuffer++;
   }
}
4

4 に答える 4

6

表示されるストライプはwrapping、操作によって引き起こされた深さの値によるもの%256です。モジュロ演算 ( %256) を適用すると、バンドが表示されますが、範囲全体に沿って深度値を再マッピングします。次に例を示します。

BYTE intensity = depth == 0 || depth > 4095 ? 0 : 255 - (BYTE)(((float)depth / 4095.0f) * 255.0f);

最大深度が 2048 の場合は、4095 を 2047 に置き換えます。

その他のポインタ:

  1. Kinect はおそらく 11 ビットの値 (0 ~ 2047) を返しますが、8 ビット (0 ~ 255) しか使用しません。
  2. 新しい Kinect バージョンは 12 ビット値 (0-4096) を返すようです
  3. DepthColorizer.csKinect エクスプローラーのソース コードには、ほとんどの魔法が発生する場所と呼ばれるファイルがあります。このコードにより、kinect エクスプローラーで深度値が非常にスムーズになると思いますが、間違っている可能性があります。
于 2012-11-02T10:57:44.443 に答える
1

深度マップの視覚化を含むプロジェクトに取り組んでいるときに、同じ問題に直面しました。ただし、Kinect SDK ライブラリの代わりに、OpenCV で OpenNI SDK を使用しました。問題は同じだったので、解決策は私と同じように機能します。

あなたの質問に対する以前の回答で述べたように、Kinect Depth マップは 11 ビット (0-2047) です。例では、8 ビットのデータ型が使用されています。

convertToこれを回避するためにコードで行ったことは、深度マップを 16 ビット Mat に取得し、関数のスケーリング オプションを使用して 8 ビット uchar Mat に変換することでした。Mat

まず、Mat深度データを取得するためのを初期化します

Mat depthMat16UC1(XN_VGA_Y_RES, XN_VGA_X_RES, CV_16UC1);

XN_VGA_Y_RES, XN_VGA_X_RES取得した深度マップの解像度を定義します。

これを行うコードは次のとおりです。

depthMat16UC1.data = ((uchar*)depthMD.Data());
depthMat16UC1.convertTo(depthMat8UC1, CV_8U, 0.05f); 
imshow("Depth Image", depthMat8UC1);

depthMDKinect センサーから取得したデータを含むメタデータです。

これが何らかの形で役立つことを願っています。

于 2012-11-02T18:41:21.610 に答える
0

深度画像データの視覚化には、粗い目立たないレベル (コード例では 0 から 255) がありますが、実際の深度画像データは 0 から 2047 の間の数値です。それらを表現するために選ばれた色。

于 2012-11-01T05:19:14.590 に答える