联系我们 contact us
地址:北京市朝阳区汤立路
   218号明天·STUDIO·A座
010-84678879

您当前所在位置:主页>技术共享>物联世界>

有点厉害 用Google街景数据创建3D城市点云模型
时间:2017-06-02 21:07 作者:佚名 点击:

  

有点厉害 用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建模解决方案。

  

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

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

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

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

  具体操作

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

  1. 合成全景图片

  2. 计算深度地图

  3. 创建点云

  4. 合成点云

  前两个步骤都要用到谷歌街景API来手机并解码之后要用到的数据。同时这也用到了两个开源Java 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 Java API允许我们获取以下会用到的数据:全景图片标识点、全景图片的分辨率、组成图片的单个Tiles的分辨率、方向、真实坐标和最终临近全景图片。

  

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

  虽然谷歌提供最高13312x6656像素的分辨率, 但是我们认为3328x1664的分辨率足够我们用了。对于我们这个项目来说,目的是用512x512像素的7x4个Tiles来组合成一个图像,因为谷歌是不允许用户直接下载全景图片的。所以,我们需要用REST API来下载这7x4的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图中的位置。当把这些组合到一张图像中,并且边缘稍微重叠之后,我们就获得了一个分辨率3328x1664的RGB图片,对应的就是特定点的全景图片。

  计算深度地图

  现在我们有了全景图片,接下来需要做的是提取对应的深度地图。Google Maps REST API允许用户从下面这个链接

  ?output=json&cb_client=maps_sv&v=4&dm=1&pm=1&ph=1&hl=en&panoid=PANORAMAID

  获得一个深度图像的JSON代码(representation)、其中包含了全景图片中每个像素从相机到最近表面的距离信息。通过处理这些数据,并将其转化成无符号8位整数的阵列( array of

  unsigned 8-bit integers)后,我们就能获得标题信息(Header Information)并获得有用的数据,例如参考平面数字(number of referenced planes)。

  

  事实上,在512x256网络上的每一个像素都对应了众多平面(Planes)中的一个,通过Normal Vector和其到摄像机的距离而定。所以,要想计算出一个像素的深度,我们必须决定从摄影机中心发出的光线和相对对应平面的交叉点。将其重复到所有平面,我们能够将深度地图制成512x256元素的32位浮动阵列(32-bit float array of 512x256 elements),这个要比我们的RGB全景图片分辨率低多了。

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

  相关阅读

  [术说

  

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

  

  IN2

  专业VR影像

  VR影视+360视频

  策划|拍摄|推广

  寻求报道/商务合作

网站地图 | RSS订阅 | RSS地图 | 网站首页 | 关于我们 | 技术共享 | 产品中心 | 成功案例 | 加盟我们 | 客户服务 | 联系我们 |
工况监测
    地址:北京市朝阳区汤立路218号明天·STUDIO·A座
    电话:0086-10-8467  8879      TEL:0086-133  6699  5587   (电话推销勿扰)
    版权所有:新企力(北京)检测服务有限公司   工作时间:(周一至周五  8:30-17:30)
    邮箱:web#xqili.com   京ICP备15050323号  
关闭