zoukankan      html  css  js  c++  java
  • 全景图转局部平面视图原理详解

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

    当然最简单的是直接从全景图里画一个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度,如下图所示,头好晕:

     

  • 相关阅读:
    解决App can’t be opened because it is from an unidentified developer
    Mac之当前目录打开终端
    Mac之安装zsh
    毕业论文之降低重复率
    Latex之希腊字母表 花体字母 实数集
    latex之插入数学公式
    好句收集
    Python之两个列表一起打乱
    Python之时间统计
    Python之正则表达式
  • 原文地址:https://www.cnblogs.com/riddick/p/10258216.html
Copyright © 2011-2022 走看看