首页 文章

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

提问于
浏览
0

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

Here is the paper link

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

img

2 回答

  • 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 .

  • 0

    快速回答:

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

    byte intensity = (byte)(irdata[i] >> 8);
    

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

    Edit

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

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

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

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

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

相关问题