2012-10-31 122 views
8

在我的應用程序中,我得到的深度框架類似於從深度基礎樣本中檢索的深度框架。我不明白的是,爲什麼圖像中存在不連續的層次?我不知道我將這些深度值的突然變化稱爲什麼。顯然,我右手的一半都是黑色的,我的左手似乎分爲3個這樣的等級。這是什麼,我該如何刪除它?Kinect深度圖像

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

當我運行KinectExplorer示例應用程序,我得到的深度如下。這是我想要從原始深度數據生成的深度圖像。

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

我使用微軟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++; 
    } 
} 
+0

請仔細檢查圖片,他們沒有顯示。 –

+0

更改了圖片網址。再檢查一遍。 – 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 explorer中的深度值非常平滑 - 但我可能是錯的。
+0

如果用較小的值作爲模數來包裝深度值,樂隊是否會進一步分開? –

1

我在處理涉及深度圖可視化的項目時遇到同樣的問題。不過,我使用OpenNV SDK而不是Kinect SDK庫。問題是一樣的,因此解決方案將爲你工作,就像它爲我做的那樣。

正如前面對您的問題的回答中所述,Kinect Depth映射是11位(0-2047)。在例子中,使用8位數據類型。

我在我的代碼來解決這個問題所做的是爲了獲得深度圖成16位墊,然後通過使用縮放選項中convertTo功能轉換爲8位UCHAR墊子Mat

第一I初始化Mat用於獲取深度數據

Mat depthMat16UC1(XN_VGA_Y_RES, XN_VGA_X_RES, CV_16UC1); 

這裏XN_VGA_Y_RES, XN_VGA_X_RES定義所獲取的深度圖的分辨率。

其中I做,這是如下所述的代碼:

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

depthMD是含有超高動力學傳感器獲取的數據的元數據。

我希望這能以某種方式幫助你。

0

kinect v2可以看到8米的深度(但超過4.5的精度下降)。 它開始約0.4米。 所以需要將一個數字8000表示爲一種顏色。 一種方法是使用RGB顏色只是一個數字。 那麼你可能會存儲一個像255x255x255像素的數字。 或者如果你有不同的顏色格式,那麼它會有所不同。 將8000存儲在255x255x255最大號碼中將產生一定數量的R + G + B,並給出這種帶狀效應。

但是,你可以將8000分或減去一個數字,或刪除超過一定的價值。

相關問題