复制正文到剪贴板 一键伪原创 一键伪原创2 恢复原文 百度原文
昨天IN2写了伊利诺伊大学的Marco Cavallo关于如何利用谷歌街景数据制作3D点云城市模型的文章,估计被标题吸引看到最后的同学会非常气愤:留图不留种,XXXXX。其实,IN2昨天下午正好有事儿,于是先把上篇做好给大家看下,你们要的“种”其实都在下篇,这篇文章里有好几个算法公式,IN2会尽最大努力翻译的靠谱,但是依然不能保证绝对正确。所以,觉得自己鸡肠文不错或者特有钻研精神的技术同学,请务必去看英文原文,然后帮IN2指出错误,谢谢鸟。
书接上文
计算深度地图
现在我们有了全景图片,接下来需要做的是提取对应的深度地图。Google Maps REST API允许用户从下面这个链接
http://maps.google.com/cbk?output=json&cb_client=maps_sv&v=4&dm=1&pm=1&ph=1&hl=en&panoid=PANORAMAID
获得一个深度图像的JSON代码(representation)、其中包含了全景图片中每个像素从相机到最近表面的距离信息。通过Base64处理这些数据,并将其转化成无符号8位整数的阵列( array of unsigned 8-bit integers)后,我们就能获得标题信息(Header Information)并获得有用的数据,例如参考平面数字(number of referenced planes)。事实上,在512×256网络上的每一个像素都对应了众多平面(Planes)中的一个,通过Normal Vector和其到摄像机的距离而定。所以,要想计算出一个像素的深度,我们必须决定从摄影机中心发出的光线和相对对应平面的交叉点。将其重复到所有平面,我们能够将深度地图制成512×256元素的32位浮动阵列(32-bit float array of 512×256 elements),这个要比我们的RGB全景图片分辨率低多了。
至于计算,对于每个点我们考虑它相关的平面,将其距离计算如下:
算法1:深度地图计算
公式中的“indeces”包含了每个像素相关平面的阵列,为了能获得一个代表单平面w? h vector的更简便的图片,例如,我们可以创造colored canvas,其中宽度为w、高度为h,而每个像素可以被定义为:
算法2:深度地图可视化
这时候会的出一个下图类似的图片
创造点云
现在我们已经有了每个像素的深度信息,我们需要创建点云同时将每一个点还原至之前获得的全景图片的色彩。考虑到 npoints =w?h points,我们定义2个npoints ?3 漂浮阵列包含了3D空间位置和每个点的色彩。现在,我们必须考虑全景图片中的一点本来来一个球星图片,所以我们必须使用下列公式将其重新投射到空间中:
算法3:点云创建
注意,除了重新投射,在2D中还原像素的位置也是必要的,因为你需要从彩色全景图片中获得色彩信息,因为全景图片的分辨率是不同的。
合成点云
利用Google Street View API提供的不同地址间的链接,我们得到了相信全景图片的标识点和地理信息。所以,我们现在可以以新的地点坐标重复之前的步骤,用全景图片创造3D场景并能够丰富此前我们用个点创建的场景,或者重建一个真实世界的场景。我们这个项目来说,会使用两个界限:两个全景图片间的最短距离以及深度信息的重复。可以将第一个载入的全景图片想象成一个数的根部,然后以一种广度优先的方式(breadth-first)进行探索。
平均来说,我们注意到谷歌的深度地图通常包含现实世界的200-300米的距离,所以我们决定以1:1的比例来重建场景。我们将第一个点云的中心坐标设为(0,0,0),然后我们根据真实世界到全景位置的距离,按照offset proportional来加入其他的数据。利用一些几何和近似值,我们可以用这样一个算法来计算[x,z]平面的distance vector:
算法4:Offset距离运算
除了这个转化,这个点云需要根据从谷歌街景中提取的Heading特定信息来沿着垂直Y轴来旋转,然后才得到了一个近似于如图的效果。
评估
投射以及位置精确度
虽然我们还没有制定任何精确的公制来进行优化,但由于设定的虚拟单位和米之间的呼应,我们倒也能以一种较为粗犷的角度来进行观察。尽管以我们的方式能够制造出传达优美几何意识的非真representation,但是要说到更多纹理和色彩的3D创建时,我们还是有一些小问题的。
例如,如图,我们能够发现深度地图和RGB全景图片之间的不协调:建筑的边缘,被旁边的淡蓝色天空给扰乱了。另外,平面上投射的点同时也包括了代表天空的点,而后者按理说应该是定义为无穷远,因此不应该出现的。
关于这点,此前有专家(Branislav Micusik)的项目使用了异常值消除,而其使用的场景是更复杂的机器学习算法。
另一个问题是较远的点,当每个全景图片载入时,最远的点变得更加稀少并且精确度消失。当组合多个点云时,有些就是不能匹配,并在重建的模型上留下噪点,
如图所示。一个简单的祛除的方式,就是在合成多个全景图片时,根据他们的距离来祛除。
最后,当单个全景的方向和维度看起来已经匹配的时候,经度方向依然有几米的误差,以至于合成多个全景图片时会出现垂直方向的“重影”效果。这个可以归咎于第四个步骤中方程式的不精确。
探索空间
为了完成上述评估,我们认为需要建立一个特定的用户交互,让他们能从不同角度探索这个重建的世界。为此,我们加上了3个camera:
·1个静止的俯瞰的摄像机,当算法联系载入全景图片时,能够一步一步的观察重建过程。这个相机永远根据最新载入的点云而变化,但同时旋转保持不变。
·1个沿椭圆形轨道旋转的相机,能够给用户一个广阔的视角来观察建造起来的点云。它的运动会根据每一帧定义为:
算法5:计算机轨道计算
·1个互动相机,可以让用户自由的在空间中移动。摄像机根据键盘方向以及鼠标移动的[x,y]平面进行移动。
另外,一个简化的菜单,让用户可以改变FOV,将全景图片重新投射在一个球面上。最后一个特性尤其重要,因为它可以让用户匹配全景图片和点云。
相关网页【重要】
以上是Marco同学的论文主题,不知道大家是不是看的昏头涨脑。对这个方法有兴趣的同学,请一定要关注原作者的论文。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.