我有一个四旋翼飞行器,它四处飞行并知道其x,y,z位置以及沿xy平面的角位移。它捕获恒定的图像流,这些图像流被转换为深度图(我们可以估计每个像素与相机之间的距离)。
如何编程一种算法,将这些信息转换为环境的3D模型?也就是说,如何根据这些信息生成虚拟3D地图?
示例:下面的图片说明了四旋翼捕获的内容(顶部)以及将图像转换为什么样的图像以馈入3D映射算法(底部)
让我们假设此图像是从具有x,y,z坐标(10、5、1)的照相机以某些单位拍摄的,并且角位移为90度。我想做的就是拿一堆这些照片坐标元组,并将它们转换成该区域的单个3D地图。
答案 0 :(得分:1)
只需将数据转换为笛卡尔并存储结果...由于您知道输入数据的拓扑(数据点之间的空间关系),因此可以直接映射到网格/曲面而不是PCL(后者将需要三角剖分或凸包等...。
您的图像表明您具有已知的拓扑结构(在3D中相邻像素也相邻...),因此您可以直接构造网格3D曲面:
同时对齐RGB和深度2D贴图。
如果尚未完成,请参见:
转换为笛卡尔坐标系。
首先,我们计算每个像素在相机局部空间中的位置:
因此,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
距图像(投影平面)很远。
由于这是从移动设备中提取的,因此需要将其转换为某些全局坐标系(使用相机位置和空间方向)。为此是最好的:
构造网格
由于您的输入数据已经在空间上进行排序,我们可以直接构造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
设置为任何合理常数(导致鱼眼效果和/或缩放输出),或从输入数据中推断出该常数,例如: