将一系列深度图和x,y,z,theta值转换为3D模型

时间:2019-07-20 12:25:19

标签: geometry geometry-surface

我有一个四旋翼飞行器,它四处飞行并知道其x,y,z位置以及沿xy平面的角位移。它捕获恒定的图像流,这些图像流被转换为深度图(我们可以估计每个像素与相机之间的距离)。

如何编程一种算法,将这些信息转换为环境的3D模型?也就是说,如何根据这些信息生成虚拟3D地图?

示例:下面的图片说明了四旋翼捕获的内容(顶部)以及将图像转换为什么样的图像以馈入3D映射算法(底部)

enter image description here

让我们假设此图像是从具有x,y,z坐标(10、5、1)的照相机以某些单位拍摄的,并且角位移为90度。我想做的就是拿一堆这些照片坐标元组,并将它们转换成该区域的单个3D地图。

1 个答案:

答案 0 :(得分:1)

只需将数据转换为笛卡尔并存储结果...由于您知道输入数据的拓扑(数据点之间的空间关系),因此可以直接映射到网格/曲面而不是PCL(后者将需要三角剖分或凸包等...。

您的图像表明您具有已知的拓扑结构(在3D中相邻像素也相邻...),因此您可以直接构造网格3D曲面:

  1. 同时对齐RGB和深度2D贴图。

    如果尚未完成,请参见:

  2. 转换为笛卡尔坐标系。

    首先,我们计算每个像素在相机局部空间中的位置:

    project

    因此,RGB映射中的每个像素(x,y)都会找到到相机焦点的深度距离,并计算相对于相机焦点的3D位置。为此,我们可以使用三角形相似度:

     x = camera_focus.x + (pixel.x-camera_focus.x)*depth(pixel.x,pixel.y)/focal_length
     y = camera_focus.y + (pixel.y-camera_focus.y)*depth(pixel.x,pixel.y)/focal_length
     z = camera_focus.z +                          depth(pixel.x,pixel.y)
    

    其中pixel是像素2D位置,depth(x,y)是对应深度,focal_length=znear是固定的摄像机参数(确定FOV)。 camera_focus是相机焦点位置。通常,相机焦点位于相机图像的中间,并且znear距图像(投影平面)很远。

    由于这是从移动设备中提取的,因此需要将其转换为某些全局坐标系(使用相机位置和空间方向)。为此是最好的:

  3. 构造网格

    由于您的输入数据已经在空间上进行排序,我们可以直接构造QUAD网格。只需为每个像素获取其邻居并形成QUADS。因此,如果使用前面的项目符号中描述的方法将数据(x,y)中的2D位置转换为3D (x,y,z),我们可以以返回3D位置的函数形式编写物联网:

    (x,y,z) = 3D(x,y)
    

    然后我可以像这样形成QUADS:

    QUAD( 3D(x,y),3D(x+1,y),3D(x+1,y+1),3D(x,y+1) )
    

    我们可以用于循环:

    for (x=0;x<xs-1;x++)
     for (y=0;y<ys-1;y++)
      QUAD( 3D(x,y),3D(x+1,y),3D(x+1,y+1),3D(x,y+1) )
    

    其中xs,ys是地图的分辨率。

如果您不知道相机的属性,可以将focal_length设置为任何合理常数(导致鱼眼效果和/或缩放输出),或从输入数据中推断出该常数,例如: