最近我读了一篇论文,他们使用深度图像从相机中提取深度强度和像素距离。但是,据我所知,深度图像中的每个像素值都表示以 mm [范围:0-65536] 为单位的距离,那么它们如何从深度图像中提取 [0 到 255] 范围内的深度强度。我不明白。kinect 传感器返回 uint16 深度帧,其中包括距传感器的每个像素距离。它不返回任何强度值,那么论文如何证明它们提取了深度强度。我真的很困惑。
这是我要提取的图表(从论文中收集:
最近我读了一篇论文,他们使用深度图像从相机中提取深度强度和像素距离。但是,据我所知,深度图像中的每个像素值都表示以 mm [范围:0-65536] 为单位的距离,那么它们如何从深度图像中提取 [0 到 255] 范围内的深度强度。我不明白。kinect 传感器返回 uint16 深度帧,其中包括距传感器的每个像素距离。它不返回任何强度值,那么论文如何证明它们提取了深度强度。我真的很困惑。
这是我要提取的图表(从论文中收集:
快速回答:
您可以通过获取相应 IR 像素的强度来获得强度。假设您有一个 IR 像素阵列,irdata
那么您可以通过intensity
i
byte intensity = (byte)(irdata[i] >> 8);
在 Kinect v2 中只有两个摄像头,一个是 RGB 摄像头,另一个是 IR 摄像头。它使用 IR 相机通过使用飞行时间 (TOF) 来计算图像的深度。如果您需要更多信息,请在此处发表评论或在 github https://github.com/shanilfernando/VRInteraction中找到我在 Kinect 上的项目。我很乐意帮助你。
编辑
如您所知,深度是 Kinect 传感器与给定空间中物体之间的距离。Kinect IR 发射器发射一束红外线并开始计时。一旦红外线反射回 kinect 的深度传感器(IR 传感器),它就会停止计时。发射和接收特定射线之间的时间 (t) 称为该射线的飞行时间。然后可以计算kinect和物体之间的距离(d)
d = (t * speed-of-light)/2
这是针对它发出的所有光线完成的,并构建 IR 图像和深度图像。每条光线都代表 IR 和深度图像中的一个像素。
我阅读了您的参考论文,首先,他们没有使用从 Kinect V2 捕获的深度图像。它明确表示其分辨率为640×480,有效距离范围为0.8米至3.5米。我希望您清楚地了解,深度框架和深度图像是两个不同的事物元素。如果您检查深度帧,每个像素是一个距离,在深度图像中每个像素是强度(多少亮度/亮度)。
在这个图中,他们试图绘制星点的强度与星点的实际距离。它们从深度(强度)图像开始,而不是深度帧。您可以将深度帧缩放到深度图像,其中值为 0 到 255,其中近点具有较高的值,而较远的点具有较低的值。
由于这个问题没有答案,我建议您使用获取自己的深度图像数据的方法。
一种简单的方法可以根据以下公式缩放图像:
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 图像。检查此链接以获取详细信息。
我猜您是在尝试从图像文件 .png 中读取深度,因此数据将转换为二进制形式。
我建议您以.tiff格式而不是png格式保存深度图像。