如何从kinect深度图像中获取深度强度,因为它表示像素距传感器的距离

时间:2017-07-05 17:17:27

标签: image-processing kinect depth openkinect kinect-v2

最近我读了一篇论文,他们使用深度图像从相机中提取深度强度和像素距离。但是,据我所知,深度图像中的每个像素值表示以mm为单位的距离[范围:0-65536],那么它们如何从深度图像中提取[0到255]范围内的深度强度。我不明白。 kinect传感器返回uint16深度帧,其中包括距传感器的每个像素距离。它没有返回任何强度值,那么论文如何证明它们提取深度强度。我真的很困惑。

Here is the paper link

这是我想要提取的图表(从论文中收集:

img

3 个答案:

答案 0 :(得分:0)

由于此问题没有答案,我建议您尝试获取自己的深度图像数据。

一种简单的方法是根据以下公式缩放图像:

    Pixel_value=Pixel_value/4500*65535

如果你想看到你从uint8获得的确切图像;我想以下步骤对您有用。

可能在将图像转换为uint8时,matlab首先将值高于某个阈值,让我们说4095=2**12-1(我不确定值)然后它会进行右移(在我们的情况下为4个班次)来制作它在0-255范围内。

所以我猜uint8的值乘以256并将其转换为uint16将帮助您获得相同的图像

        Pixel_uint16_value= Pixel_uint8_value*256 //or Pixel_uint16_value= Pixel_uint8_value<<8 
        //dont forget to cast the result as uint16

将原始数据转换为以毫米为单位的深度图像的另一种方法。

深度图像 应以毫米为单位存储,并以16位无符号存储 整数。可以使用以下两个公式 将原始数据转换为毫米。

distance = 1000/ (− 0.00307 ∗ rawDisparity + 3.33 )
distance = 123.6 ∗ tan ( rawDisparity/2842.5 + 1.1863 )

将每个距离值保存到对应的rawdisparty像素。将它们保存为16位无符号灰度png图像。有关详细信息,请查看此link

答案 1 :(得分:0)

快速回答:

您可以通过获取相应IR像素的强度来获得强度。假设你有一个红外像素阵列irdata, 那么你可以通过

获得intensity像素的i
byte intensity = (byte)(irdata[i] >> 8);

在Kinect v2中只有两个摄像头,一个是RGB摄像头,另一个是红外摄像头。它使用红外摄像机通过使用飞行时间(TOF)计算图像的深度。如果您需要更多信息,请在此处发表评论或在github https://github.com/shanilfernando/VRInteraction上找到我在Kinect上的项目。我很乐意帮助你。

修改

如您所知,深度是Kinect传感器与给定空间中物体之间的距离。 Kinect红外发射器发射一束红外线并开始计时。一旦红外线反射回kinect的深度传感器(IR传感器),它就会停止时间计数器。发射和接收特定射线之间的时间(t)称为该射线的飞行时间。然后kinect和对象之间的距离(d)可以通过

计算
d = (t * speed-of-light)/2

这是针对它发出的所有光线完成的,并构建红外图像和深度图像。每条光线代表IR和深度图像中的像素。

我读了你的参考文件,首先,他们没有使用从Kinect V2中捕获的深度图像。它明确表示其分辨率为640×480,有效距离范围为0.8米至3.5米。 我希望你明确地知道,深度框架和深度图像是两个不同的元素。如果你检查深度帧,每个像素是一个距离,在深度图像中每个像素是强度(多少亮/亮)。

在这个图中,他们试图将星点的强度与星点的实际距离进行对比。它们以深度(强度)图像开始,而不是深度帧。深度帧可以缩放到深度图像,其中值为0到255,其中近点具有较高值,而其他点具有较低值。

答案 2 :(得分:0)

我想您正在尝试从Image文件.png中读取深度,因为该文件会将数据转换为二进制格式。

我建议您将深度图像保存为 .tiff 格式,而不是 png 格式。