需要帮助正确进行等距投影的全景图像矩形化处理

7
使用以下算法,当投影平面切线与赤道(等距图像的中心线)相同时,投影图像看起来是直线的。 Rectilinear image 但是,当投影平面倾斜时(py0 != panorama.height/2),线条会变形。 Warped image 以下算法中的最后两个“线”需要进行“矫正”,以便在目标平面的中心线与等距图像的中心线不在同一水平线上时,调整 px 和/或 py。
  // u,v,w :
  //     Normalized 3D coordinates of the destination pixel

  // elevation, azimuth:
  //     Angles between the origin (sphere center) and the destination pixel

  // px0, py0 :
  //     2D coordinates in the equirectangular image for the
  //     the destination plane center (long*scale,lat*scale)

  // px, py:
  //     2D coordinates of the source pixel in the equirectangular image
  //     (long*scale,lat*scale)

  angularStep=2*PI/panorama.width;
  elevation=asin(v/sqrt(u*u+v*v+w*w));
  azimuth=-PI/2+atan2(w,u);
  px=px0+azimuth/angularStep;
  py=py0+elevation/angularStep;

我可以计算每个目标像素的法线与球的交点p,然后使用现有的C代码将笛卡尔坐标转换为经度/纬度:

projection

但我知道有一种更简单、耗时更少的方法,涉及调整等距矩形图像中的源像素坐标(px,py),并知道投影平面的中心与“球”相交的经度/纬度(px0,py0)。
请问你能帮忙吗?
1个回答

2

我使用gnomonic投影的公式在webgl着色器中使其正常工作http://mathworld.wolfram.com/GnomonicProjection.html

            float angleOfView   

            float phi1          
            float lambda0     //centre of output projection

            float x = PI2*(vTextureCoord.s - 0.5) ;  //input texture coordinates, 
            float y = PI2*(vTextureCoord.t - 0.5 ); 

            float p = sqrt(x*x + y*y);

            float c = atan(p, angleOfView); 

            float phi = asin( cos(c)*sin(phi1) + y*sin(c)*cos(phi1)/p );

            float lambda = lambda0 + atan( x*sin(c), (p*cos(phi1)*cos(c) - y*sin(phi1)*sin(c)));

            vec2 tc = vec2((lambda /(PI*2.0) + 0.5, (phi/PI) + 0.5); //reprojected texture coordinates 

            vec4 texSample  =  texture2D(tEqui, tc); //sample using new coordinates

1
嗨。我正在寻找解决方案,然后发现了您的答案,似乎很有效。不过我有一个问题。为什么您在开头将这些公式应用于纹理坐标,并在结尾将其应用于lambda和phi?另外,PI2是指PI * 2吗? - Solidus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接