2012-10-31 10 views
8

私のアプリケーションでは、Depth Basics Sampleから取得したデプスフレームと同様のデプスフレームを取得しています。私が理解していないことは、なぜイメージに個別のレベルがあるのでしょうか?私はこれらの急激な深さの変化を何と呼ぶのか分かりません。明らかに私の右手の半分はすべて黒で、左手は3つのレベルに分けられているようです。これは何ですか?これをどのように削除しますか?Kinect Depth Image

Kinect Depth Basics Sample http://i46.tinypic.com/2hwekxd.jpg

私はKinectExplorerサンプルアプリを実行すると、以下のように私は深さを取得します。これは、生の奥行きデータから生成したい奥行き画像です。

Kinect Explorer http://i50.tinypic.com/2rwx1z5.jpg

私はOpenCVのに伴い、マイクロソフトのKinect SDKの(バージョン1.6)NuiApiを使用しています。私は、次のコードを持っている:

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++; 
    } 
} 
+0

画像をもう一度確認してください。画像が表示されません。 –

+0

イメージのURLを変更しました。もう一度チェック。 – thinkquester

+0

'' cn''は本当に '' 4''ではなく '' 3''でなくてはなりませんか?また、実際に画像を出力する場所を知るためには気が散っています。 – Tim

答えて

0

奥行き画像データの可視化は、(0〜255コードの例では)粗い離散レベルを有するが、実際の深さ画像データがまだ0と2047の間の数でありますもちろん慎重ではありませんが、それを描写するために選んだ色のような粗い単位ではありません。

5

表示されるストライプは、%256操作によって引き起こされた、奥行値のwrappingによるものです。代わりに、バンドは、例えば、表示範囲全体に沿って深さ値を再マップする原因となっている、剰余演算(%256)を適用する:

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

場合には、あなたの最大の深さは2048、2047年と4095を置き換えます。

複数のポインタ:

  1. のKinectは、おそらく11ビットの値(0〜2047)を返しますが、あなただけの8ビット(0〜255)を使用します。
  2. 新しいKinectのバージョンは12ビットの値(0から4096)のKinectエクスプローラのソースコード内の
  3. を返すように見える、魔法のほとんどが起こるようですDepthColorizer.csと呼ばれるファイルがあります。私は、このコードは、深さの値をkinectエクスプローラで非常に滑らかにすると信じていますが、間違っているかもしれません。
+0

モジュロとして小さい値を使用して深度値をラップした場合、バンドはさらに離れていますか? –

1

深度マップの視覚化を含むプロジェクトに取り組んでいたとき、同じ問題が発生しました。しかし、私はKinect SDKライブラリの代わりにOpenCVでOpenNI SDKを使用しました。問題は同じだったので、解決策は私のためにあなたのために働くでしょう。

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

は、16ビットのマットにデプスマップを取得し、その後、Mat

ためconvertTo機能のスケーリングオプションを使用して、8ビットUCHARマットに変換することでしたまず、私はここで

Mat depthMat16UC1(XN_VGA_Y_RES, XN_VGA_X_RES, CV_16UC1); 

XN_VGA_Y_RES, XN_VGA_X_RESは、取得したデプスマップの解像度を定義する深度データを取得するためのMatを初期化します。次のように

私はこれを行うコードは次のとおり

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

depthMDは、オンラインショップセンサから取得したデータを含むメタデータです。

私はこれが何らかの形であなたを助けてくれることを願っています。

0

キネクトv2は8メートルの深さを見ることができます(ただし、4.5を超える精度は低下します)。 約0.4メートルから始まります。 だから1つの色に数字8000を表現する必要があります。 これを行う方法は、RGBカラーを数だけ使用することです。 あなたは潜在的に255x255x255のような数値をピクセルに格納することができます。 色の形式が異なる場合は、異なる場合があります。 255x255x255の数値で8000を保存すると、一定量のR + G + Bが得られ、このバンディング効果が得られます。

しかし、8000を逸脱したり、数を減算したり、特定の値を超えて削除することはできません。