鱼眼校正公式,需要解释

Fisheye correction formula, need explanation

经过大量搜索,我未能找到解释得当的 WebGL 鱼眼图像校正公式。 fisheye/antifisheye 处的 Shadertoy 显示公式

uv = m + normalize(d) * atan(r * -power * 10.0) * bind / atan(-power * bind * 10.0);

字面上描述为"weird formula"。它以某种方式遵循 Paul Burke 在镜头畸变校正方面的工作 here,但我看不出两者之间的联系。在我的应用程序中,公式归结为(值是根据我的镜头和网络摄像头手动调整的):

uv = centerPoint + normalize(d) * atan(r * pi) * 1/3 / atan(pi/3)

其中 r 是像素距图像中心的距离,d 是该方向上的单位向量,而 centerPoint 是图像的中心。我不明白反正切怎么能直接与坐标联系起来,谁能帮我弄到?我确实知道公式中带有反正切的部分是计算距图像中心的像素距离,我不明白这是如何计算的。

谢谢!

好的,经过一番搜索和询问,我明白了公式中发生的事情。图表和基本公式如下图所示:]1。由于 xy' 位置已知 - 它是纹理上的目标位置,我们计算 xy - 鱼眼图像上的源像素。 R是鱼眼图像半径。我们可以根据我们想要达到的最大视角来替换所需的 d 值(因为正切函数在 90 度时趋于无穷大并且 tan(B) = 1/d,所以最好取一个合理的值)。 转换后,我们得到:

xy= atan(xy'/d)* 2R/pi

这是理论上正确的等距投影公式,我们假设它是在镜头中进行的。我在原始 post 中引用的公式有其他东西而不是 2R/pi 并且由于镜头中的缺陷它仍然有效 - 它很可能具有一些我们永远不会知道的奇怪函数并且它作为近似值起作用。

好了,希望大家看得懂,如有任何问题,我很乐意解答:)