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度,如下图所示,头好晕:

     

  • 相关阅读:
    为蓝桥杯准备
    Java里子类调用父类构造方法问题
    boost库的Singleton的实现以及static成员的初始化问题
    VS2005调试小记
    <转载>程序员每天该做的事
    vs2005, 2008 使用了未初始化的msg变量
    转载 vs2005 快捷键大全
    VS2005右键点击转到定义后出现“未定义符号”的提示及其解决
    软件工程配置规范(VC2005) 第二版(转载)
    匆忙赶路的时候别忘了适时停下来回头看看
  • 原文地址:https://www.cnblogs.com/riddick/p/10258216.html
Copyright © 2011-2022 走看看