前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全景图转局部平面视图原理详解

全景图转局部平面视图原理详解

作者头像
一棹烟波
发布2019-05-25 16:01:03
2.7K1
发布2019-05-25 16:01:03
举报
文章被收录于专栏:一棹烟波一棹烟波

前面两篇博客主要讲了如何从全景图转到小行星、水晶球视图。今天来说下如何从全景图中取一块儿平面视图出来。

当然最简单的是直接从全景图里画一个ROI,然后扣一块儿区域出来。但是很多时候这样的操作并不方便,如果要是截取的区域跨越了拼接缝的话就麻烦了。

一劳永逸的方法当然还是将全景图贴到球面去做,假设观察者(比如我)在球内部贴着球面观看,只能看到球的一部分区域。那我不断转动这个球,我就能看到这个球不同位置的局部区域图,因为我贴的很近,我真是闲得慌。

依然使用下面这张风景秀丽的全景图:

1. 还是将全景图贴到球面,经纬展开法应该是老方法了。建立球面坐标系,x轴向右,y轴垂直向内,z轴向上,符合右手坐标系。

2. 仍然采用反向映射的方法,首先在球的南极点放置一张与南极点相切的平面(也就是我们要获取的局部平面图)。

3.设定视场角FOV,设定要获取的局部平面图的大小(W,H)。我们可以粗略计算出一个归一化的焦距f = (0.5*W)/tan(fov *0.5)。

4.局部视图上的坐标(u,v),转换到球面坐标系坐标为(x,y,z):

  其中x = u - W*0.5, y = H*0.5 - v, z =f

5. 得到(x, y, z)后就好办了,转换到球坐标(theta, fi):

theta = acos( z/sqrt(x*x+y*y+z*z) )

fi = acos( x/sqrt(x*x+y*y) ) if (y<0) fi=2*pi - fi

6. 得到球坐标后就可以获取全景图的坐标(U, V),如果全景图的尺寸是(panoW, panoH):

U = fi * panoW/ (2 * pi);

V = theta * panoH / pi;

7. 老样子,双线性插值,从(U,V)周围四个点插值得到(u,v)。

这样就获取了南极点一小片区域的平面图。那如果我需要观看其他位置,我又懒地跑过去贴上去,我只用转动球就行。也就是在第5步中,对x, y, z施加一个旋转矩阵R,得到新的X, Y, Z 后再投影即可。

利用上述方法再也不担心跨越拼接缝的问题了,想看哪里看哪里。生成一段环视赤道的局部平面图,fov为75度,如下图所示,头好晕:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档