Kinect深度图像

thi*_*ter 8 opencv kinect kinect-sdk

在我的应用程序中,我得到的深度框架类似于从深度基础样本中检索到的深度框架.我不明白的是,为什么图像中存在离散的水平?我不知道我称之为深度值的这些突然变化.很明显,我右手的一半都是黑色的,我的左手似乎分为3个这样的等级.这是什么以及如何删除它?

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

当我运行KinectExplorer示例应用程序时,我获得如下深度.这是我想从原始深度数据生成的深度图像.

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

我正在使用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++;
   }
}
Run Code Online (Sandbox Code Playgroud)

mem*_*elf 5

您看到的条纹是wrapping%256操作引起的深度值引起的.而不是应用%256导致波段显示的模运算(),重新映射整个范围内的深度值,例如:

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

如果您的最大深度为2048,请将2095替换为2047.

更多指针:

  1. Kinect可能会返回11位值(0-2047),但您只使用8位(0-255).
  2. 新的Kinect版本似乎返回12位值(0-4096)
  3. 在Kinect资源管理器源代码中,有一个文件称为DepthColorizer.cs大多数魔法似乎发生的地方.我相信这段代码使kinect资源管理器中的深度值如此平滑 - 但我可能错了.


Eri*_*sen 0

深度图像数据的可视化具有粗糙的离散级别(在代码示例中为 0 到 255),但实际深度图像数据是 0 到 2047 之间的数字。当然,仍然离散,但不是采用像选择来描绘它们的颜色。