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

     

  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/riddick/p/10258216.html
Copyright © 2011-2022 走看看