有点厉害 用Google街景数据创建3D城市点云模型

昨天IN2发了Matterport的新Pro2 3D相机,并开玩笑让做地产VR的哥们都歇了,结果做地产VR的哥们都很生气,纷纷拒绝转载。别这样嘛,只不过是个小3D扫描相机而已,你要是看到今天歪果仁的黑科技,还不得吓到尿血?

用3D相机扫描一个房间容易,但是要扫描一条大街,一个城市就没那么容易了是不是。不要紧,有外国同学用谷歌街景提取的数据,生生做出了3D点云的模型,这方法是如此奇巧淫技,IN2不得不转给大家看下。

学术宅拯救世界

要说真科技朋克,还得是大学实验室里的哥们。资讯里提到的“高端薅谷歌街景羊毛”的方法,来自伊利诺伊大学的Marco Cavallo的论文《从谷歌街景重建3D城市》(3D City Reconstruction From Google Street View)。Marco在论文中表示,虽然3D扫描技术在近年已经取得了一些进展,但是要获得大型的城市3D模型还是昂贵且难度极高的。同时,像谷歌街景这样的应用,能以免费的成本提供大量地点的高清全景图片。Marco的目的,就是利用这些免费的全景街景图片,搭配上提取出来的深度信息,来研发一个低成本且自动的城市3D建模解决方案。

这个解决方案的原理是怎样的?简单来说,谷歌街景可以被看成是一个可共浏览的线上数据库,它里面包含了数十亿个街道全景图片。从2007年开始,谷歌就不断搜集这些数据,在城市区域基本上是5-10米拍摄一张。同时,谷歌提供开放的API接口,根据一个GPS坐标或者单一识别点(unique identifier)就能获得一个全景图片的虚拟相机图像(View)。这些图像是全景图片的直角投射,用户可以改变FOV、方向和角度。这些图像可以被看成是小孔成像拍摄的无失真图片,为了制作成360°全景图片而有一些重叠。

另外,根据谷歌激光扫描在物体表面的反射速度,能够算出相机和反射物体或者建筑的距离,也为谷歌地图等应用建立3D模型提供了帮助。谷歌的API事实上提供了一个获取和全景图片对应的深度信息的方法,正好可以让我们用来重建3D场景。经过解码并在空间中重建起来,这些根据深度信息建立起来的模型可以用于多个方向,例如导航、AR甚至VR。

理论上是这么个事儿, 咱们看看具体操作。

具体操作

虽然听起来挺麻烦,但其实Marco Cavallo的应用可以归纳为以下几个步骤:

1. 合成全景图片

2. 计算深度地图

3. 创建点云

4. 合成点云

前两个步骤都要用到谷歌街景API来手机并解码之后要用到的数据。同时这也用到了两个开源Javascript Library,GSVPano和GSVPanoDepth,用来提取和合成谷歌的图片。

合成全景图片

首先,需要获得特定起始点最接近的全景图片,用这个链接地址:

(https://maps.google.com/cbk?output=json&hl=x-local&ll=LAT,LNG&cb_client=maps_sv&v=3),

向Google Maps REST API发起请求(Call),是能够获得这个全景图片的独立标识点的。Google Street View Service Javascript API允许我们获取以下会用到的数据:全景图片标识点、全景图片的分辨率、组成图片的单个Tiles的分辨率、方向、真实坐标和最终临近全景图片。

虽然谷歌提供最高13312×6656像素的分辨率, 但是我们认为3328×1664的分辨率足够我们用了。对于我们这个项目来说,目的是用512×512像素的7×4个Tiles来组合成一个图像,因为谷歌是不允许用户直接下载全景图片的。所以,我们需要用REST API来下载这7×4的Tiles。

https://cbks2.google.com/cbk?cb_client=maps_sv.tactile&authuser=0&hl=en&panoid=PANORAMAID&output=tile&zoom=QUALITY&x=XPOS&y=YPOS&TIMESTAMP

在我们这个项目中,QUALITY是3, XPOS和YPOS分别对应7x4Tiles图中的位置。当把这些组合到一张图像中,并且边缘稍微重叠之后,我们就获得了一个分辨率3328×1664的RGB图片,对应的就是特定点的全景图片。

计算深度地图

现在我们有了全景图片,接下来需要做的是提取对应的深度地图。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全景图片分辨率低多了。

至于如何通过算法制作深度地图信息,请明天继续关注IN2。

相关阅读

[术说]Deepano专家详解360°视频深度信息及6自由度VR

Facebook新VR相机详解:深度信息如何产生 6DOF如何实现

用雷达做出深度信息360视频的公司 被Red创始人看上了

[消息来自www.evl.uic.edu IN2原创资讯转载请注明来源及链接]

Add a Comment