将一系列深度图和 x、y、z、theta 值转换为 3D 模型
Converting a series of depth maps and x, y, z, theta values into a 3D model
我有一个四旋翼飞行器,它可以四处飞行并知道它的 x、y、z 位置和 angular 沿 x、y、z 轴的位移。它捕获不断转换为深度图的图像流(我们可以估计每个像素与相机之间的距离)。
如何编写一种算法,将此信息转换为环境的 3D 模型?也就是说,我们如何根据这些信息生成虚拟 3D 地图?
示例:下图说明了四旋翼飞行器捕获的内容(顶部)以及图像被转换为 3D 映射算法的内容(底部)
假设此图像是从相机拍摄的,某些单位的 x、y、z 坐标为 (10、5、1),并且 angular 关于 x、y 的位移为 90、0、0 度, z 轴。我想要做的是获取一堆这些照片坐标元组并将它们转换为该区域的单个 3D 地图。
7 月 30 日编辑 1: 一个明显的解决方案是使用四轴飞行器相对于 x、y 和 z 轴的角度与距离图来计算具有三角函数的任何障碍物的笛卡尔坐标。我想我可能会编写一个算法,使用这种方法和概率方法来制作粗略的 3D 地图,可能对其进行矢量化以使其更快。
但是,我想知道是否有任何根本不同且有望更快的方法来解决这个问题?
只需将您的数据转换为笛卡尔坐标并存储结果...因为您已经知道输入数据的拓扑结构(数据点之间的空间关系),因此可以直接映射到 mesh/surface 而不是到 PCL(这需要三角剖分或凸包等...)。
你的图像表明你已经知道拓扑结构(相邻像素在 3D 中也是相邻的......)所以你可以直接构建网格 3D 表面:
对齐 RGB 和深度二维贴图。
如果这还没有完成,请参阅:
转换为直角坐标系
首先我们计算每个像素在相机局部的位置space:
所以 RGB 图中的每个像素 (x,y)
我们找出到相机焦点的深度距离并计算相对于相机焦点的 3D 位置 point.For 我们可以使用三角形相似性所以:
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
是像素二维位置,depth(x,y)
是相应的深度,focal_length=znear
是固定相机参数(确定FOV)。 camera_focus
是相机焦点位置。通常相机焦点在相机图像的中间并且znear
远离图像(投影平面)。
由于这是从移动设备中获取的,因此您需要将其转换为某个全局坐标系(使用 space 中的相机位置和方向)。因为那是最好的:
构造网格
由于您的输入数据已经按空间排序,我们可以直接构建 QUAD 网格。简单地为每个像素取其邻居并形成 QUADS。因此,如果您的数据 (x,y)
中的 2D 位置通过上一条项目符号中描述的方法转换为 3D (x,y,z)
,我们可以以 returns 3D 位置:
的函数形式编写物联网
(x,y,z) = 3D(x,y)
然后我可以像这样组成四边形:
QUAD( 3D(x,y),3D(x+1,y),3D(x+1,y+1),3D(x,y+1) )
我们可以使用 for 循环:
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
设置为任何 合理的 常量(导致鱼眼效果和/或缩放输出)或推断它来自输入数据,例如:
- Transformation of 3D objects related to vanishing points and horizon line
我有一个四旋翼飞行器,它可以四处飞行并知道它的 x、y、z 位置和 angular 沿 x、y、z 轴的位移。它捕获不断转换为深度图的图像流(我们可以估计每个像素与相机之间的距离)。
如何编写一种算法,将此信息转换为环境的 3D 模型?也就是说,我们如何根据这些信息生成虚拟 3D 地图?
示例:下图说明了四旋翼飞行器捕获的内容(顶部)以及图像被转换为 3D 映射算法的内容(底部)
假设此图像是从相机拍摄的,某些单位的 x、y、z 坐标为 (10、5、1),并且 angular 关于 x、y 的位移为 90、0、0 度, z 轴。我想要做的是获取一堆这些照片坐标元组并将它们转换为该区域的单个 3D 地图。
7 月 30 日编辑 1: 一个明显的解决方案是使用四轴飞行器相对于 x、y 和 z 轴的角度与距离图来计算具有三角函数的任何障碍物的笛卡尔坐标。我想我可能会编写一个算法,使用这种方法和概率方法来制作粗略的 3D 地图,可能对其进行矢量化以使其更快。
但是,我想知道是否有任何根本不同且有望更快的方法来解决这个问题?
只需将您的数据转换为笛卡尔坐标并存储结果...因为您已经知道输入数据的拓扑结构(数据点之间的空间关系),因此可以直接映射到 mesh/surface 而不是到 PCL(这需要三角剖分或凸包等...)。
你的图像表明你已经知道拓扑结构(相邻像素在 3D 中也是相邻的......)所以你可以直接构建网格 3D 表面:
对齐 RGB 和深度二维贴图。
如果这还没有完成,请参阅:
转换为直角坐标系
首先我们计算每个像素在相机局部的位置space:
所以 RGB 图中的每个像素
(x,y)
我们找出到相机焦点的深度距离并计算相对于相机焦点的 3D 位置 point.For 我们可以使用三角形相似性所以: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
是像素二维位置,depth(x,y)
是相应的深度,focal_length=znear
是固定相机参数(确定FOV)。camera_focus
是相机焦点位置。通常相机焦点在相机图像的中间并且znear
远离图像(投影平面)。由于这是从移动设备中获取的,因此您需要将其转换为某个全局坐标系(使用 space 中的相机位置和方向)。因为那是最好的:
构造网格
由于您的输入数据已经按空间排序,我们可以直接构建 QUAD 网格。简单地为每个像素取其邻居并形成 QUADS。因此,如果您的数据
的函数形式编写物联网(x,y)
中的 2D 位置通过上一条项目符号中描述的方法转换为 3D(x,y,z)
,我们可以以 returns 3D 位置:(x,y,z) = 3D(x,y)
然后我可以像这样组成四边形:
QUAD( 3D(x,y),3D(x+1,y),3D(x+1,y+1),3D(x,y+1) )
我们可以使用 for 循环:
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
设置为任何 合理的 常量(导致鱼眼效果和/或缩放输出)或推断它来自输入数据,例如:
- Transformation of 3D objects related to vanishing points and horizon line