如何从 kinect 深度图像中获取深度强度,因为它表示像素到传感器的距离
Posted
技术标签:
【中文标题】如何从 kinect 深度图像中获取深度强度,因为它表示像素到传感器的距离【英文标题】:How can I get the depth intensity from kinect depth image since it respresents distance of pixel from sensor 【发布时间】:2017-07-05 17:17:26 【问题描述】:最近我读了一篇论文,他们使用深度图像提取深度强度和像素与相机的距离。但是,据我所知,深度图像中的每个像素值都表示以毫米为单位的距离 [范围:0-65536] 那么他们如何从深度图像中提取 [0 到 255] 范围内的深度强度。我不明白。 kinect 传感器返回 uint16 深度帧,其中包括距传感器的每个像素距离。它不返回任何强度值,那么论文如何证明它们提取了深度强度。我真的很困惑。
Here is the paper link
这是我要提取的图表(从论文中收集:
【问题讨论】:
我没有看到深度强度热的任何定义......它可能与名称所暗示的含义不同。 什么意思? 这就是问题......很可能只有论文的作者才能回答...... 没有他的回复。 【参考方案1】:由于这个问题没有答案,我建议您获取自己的深度图像数据。
一种简单的方法可以根据以下公式缩放图像:
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。
【讨论】:
感谢您的合作。但我有深度图像原始数据,即像素与传感器的距离。问题是深度图像只返回距离,所以如果我在 uint8 或任何缩放方法中转换它,那么它与距离成正比。但是这张图显示成反比,这意味着他们以某种方式获得了深度强度。我可以提取距离但无法获得深度强度。即使我对谷歌的深度强度一无所知。 @sufianahmed 抱歉回复晚了,我才注意到这条评论。我看了看论文,深度图像看起来像视差图像。这与反深度成正比。理论上视差等于 d=b*f/z,其中 b 代表基线,f 代表焦距,z 代表深度。【参考方案2】:快速回答:
您可以通过获取相应IR像素的强度来获得强度。假设你有一个红外像素阵列irdata
,
那么你可以得到i
th像素的intensity
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,其中近点具有较高的值,而较远的点具有较低的值。
【讨论】:
kinect v2 有一个 rgb 摄像头,另一个是 Ir 发射器,一个是深度传感器,我想。有人建议我这只是在 0 到 255 之间缩放 是的,你是对的。但是深度传感器有什么作用?它计算红外线发射器发出的红外线的飞行时间。这样红外发射器+深度传感器就叫红外摄像头了。 当然强度在 0 到 255 之间缩放,深度范围在 0 到 65536 之间缩放。但实际上,kinect 无法测量到 65536。它的深度范围在 0.5m 和 4m 之间,FOV 为 70.6 x 60 度。如果你有 IEEE 文章的访问权限,请查看我的文章http://ieeexplore.ieee.org/document/7726202/ “计算红外线的飞行时间”......这是什么意思先生?......“强度在 0 到 255 之间缩放”......不,先生,我不是那个意思。在上图中,您可以看到深度强度......有人建议我这个深度强度是从深度距离缩放的。对吗? @sufianahmed 是的,我编辑了我的答案,请检查一下,让我知道你是否理解清楚。如果您有任何困惑,我可以进一步解释。【参考方案3】:我猜你正试图从图像文件 .png 中读取深度,因此数据被转换为二进制形式。
我建议您将深度图像保存为 .tiff 格式而不是 png 格式。
【讨论】:
以上是关于如何从 kinect 深度图像中获取深度强度,因为它表示像素到传感器的距离的主要内容,如果未能解决你的问题,请参考以下文章
如何缩放 kinect 深度图像以在 matlab 中应用 LBP?
ubuntu 14.04 +Kinect+ openNI+ openCV+ Sensorkinect 配置 +获取深度图像及相关问题