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. 在 Kinect 资源管理器源代码中,有一个名为DepthColorizer.cs大多数魔法似乎发生的地方的文件。我相信这段代码使 kinect explorer 中的深度值如此平滑——但我可能错了。
于 2012-11-02T10:57:44.443 回答
1

我在处理一个涉及深度图可视化的项目时遇到了同样的问题。但是我使用 OpenNI SDK 和 OpenCV 而不是 Kinect SDK 库。问题是一样的,因此该解决方案对你有用,就像对我一样。

正如您之前对问题的回答中提到的,Kinect 深度图是 11 位 (0-2047)。在示例中,使用了 8 位数据类型。

为了解决这个问题,我在代码中所做的是将深度图获取为 16 位 Mat,然后使用convertTo函数中的缩放选项将其转换为 8 位 uchar MatMat

首先我初始化一个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);

depthMD是包含从 Kinect 传感器检索到的数据的元数据。

我希望这对您有所帮助。

于 2012-11-02T18:41:21.610 回答
0

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

于 2012-11-01T05:19:14.590 回答
0

kinect v2 可以看到 8 米的深度,(但超过 4.5 的精度会降低)。它开始于 0.4 米左右。因此,需要将数字 8000 表示为一种颜色。一种方法是使用 RGB 颜色只是一个数字。那么你可能会存储一个像 255x255x255 ia 像素这样的数字。或者,如果您有不同的颜色格式,那么它会有所不同。在 255x255x255 的最大数字中存储 8000 将产生一定数量的 R+G+B,从而产生这种条带效应。

但是您当然可以除以 8000 或减去一个数字,或删除超出某个值。

于 2016-03-12T22:04:50.253 回答