2012-10-31 123 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分或减去一个数字,或删除超过一定的价值。

相关问题