对于我目前正在从事的大学项目,我必须通过从this数据集中读取图像来创建点云。这些基本上是视频帧,每个帧都有一个rgb图像以及相应的深度图像。
我对方程z = f*b/d
很熟悉,但是我无法弄清楚应该如何解释数据。没有提供有关用于拍摄视频的摄像机的信息,并且该项目还指出以下内容:
“考虑摄像机的水平/垂直视场48.6 / 62 度”
我几乎没有计算机视觉方面的经验,而且我以前从未遇到过2个视野。假设我按原样使用图像的深度(对于z坐标),我将如何计算点云中每个点的x和y坐标?
下面是数据集的示例:
答案 0 :(得分:2)
是的,指定多个视野是不寻常的。给定典型的相机(方形像素,最小失真,通过图像中心的视图矢量),通常仅给出一个视场角(水平或垂直),因为另一个视场角可以从图像宽高比中得出。
在这里指定48.6的水平角度和62的垂直角度特别令人惊讶,因为图像是风景视图,我希望水平角度大于垂直角度。我很确定这是一个错字:
交换后,给定图像尺寸和正方形像素,比例tan(62 * pi / 360) / tan(48.6 * pi / 360)
是您期望的640 / 480
长宽比。
无论如何,t
的水平角度基本上是指图像的水平范围从左边缘到右边缘覆盖视场的t
弧度的弧,因此右边缘中心的像素沿着从中心视线向右旋转t / 2
弧度的光线。这条“右手”射线从眼睛的原点穿过(tan(t / 2), 0, -1)
点(假设一个右手空间,正x指向右,正y指向上,向下看z负轴)。要获得距眼睛d
处的空间点,您可以沿该射线对向量进行归一化并乘以d
。假设样本在平面传感器上线性分布,我希望对于(x, y)
处的给定像素,您可以使用以下方法计算其相应的射线点:
p = (dx * tan(hfov / 2), dy * tan(vfov / 2), -1)
其中dx
是2 * (x - width / 2) / width
,dy
是2 * (y - height / 2) / height
,并且hfov
和vfov
是弧度的视场角
请注意,示例数据随附的documentation链接到Matlab file,其中显示了将深度图转换为点云和距离场的推荐过程。其中,将视场与图像尺寸烘焙到恒定的570.3倍,可用于恢复作者认为其记录设备具有的视场角:
atan(320 / 570.3) * (360 / pi / 2) * 2 = 58.6
这确实非常接近您获得的62度。
从Matlab代码看来,图像中的值不是从给定点到眼睛的距离,而是沿着视图矢量到包含给定点的垂直平面的距离(“深度”,或者基本上是“ z“),因此作者可以直接将其与向量(dx * tan(hfov / 2), dy * tan(vfov / 2), -1)
相乘以得到空间点,而跳过前面提到的归一化步骤。