鱼眼投影模型理解以及opencv官方文档和同类文章勘误

最近研究鱼眼投影模型,一篇比较全的博客是鱼眼镜头的成像原理到畸变矫正(完整版)

同类文章也有不少,但受opencv官方文档影响,在公式推导和解读上都有同样的纰漏,找到原始论文经过一番研究后,进行以下分析:

一、鱼眼的各种投影模型
鱼眼投影模型理解以及opencv官方文档和同类文章勘误_第1张图片假设用d(distortion)来代表畸变后的变量,则上面几个模型都是rd与θ的关系,其中r代表无畸变情况下像素离图像中心的距离,rd代表畸变情况下像素离图像中心的距离(如下图等距投影的图示,图像平面为归一化像平面,f=1),θ代表入射角,θd代表出射角。上面几个模型从公式和图形上可以很好地理解,就是各种把球面上的点一一映射到平面的方法。图可参照博客https://www.jianshu.com/p/d4a62c3f46ef
鱼眼投影模型理解以及opencv官方文档和同类文章勘误_第2张图片

二、Kannala-Brandt 模型

Juho Kannala 和 Sami S. Brandt在《A Generic Camera Model and Calibration Method for Conventional, Wide-Angle, and Fish-Eye Lenses》论文中提出了一种一般的鱼眼模型,也是opencv和一般通常使用的模型,用入射角θ的奇数次泰勒展开式来进行鱼眼模型的通用表示:
在这里插入图片描述
这里θ的一次项系数为1,所以一般使用k2-k5四个系数来计算鱼眼图像的畸变。

三、完整模型
鱼眼投影模型理解以及opencv官方文档和同类文章勘误_第3张图片
根据如上示意图,可以得到相机坐标系的一点P到鱼眼图像坐标p’的坐标转换,P0代表无畸变的投影位置,红线代表离畸变中心的距离rd,同样设f=1。
以下是opencv官方文档中的公式推导:鱼眼投影模型理解以及opencv官方文档和同类文章勘误_第4张图片
知乎和CSDN的博客几乎都是根据以上推导解释的,乍一看没啥问题,但看到畸变坐标x’和y’的表达式就有点疑惑,按照相似三角形公式,畸变比例难道不应该是rd/r吗,怎么变成了θd/r,opencv文档里没有解释,其他博客很多解释为:

按照等距投影模型公式:r = f * θ, 设f=1,得到rd=θd,但这显然是不对的,因为第一,这里已经用了一般的畸变模型,不应该再次用等距模型,还有人说Kannala-Brandt 模型就是从等距模型演变的,更是无稽之谈,这是一个综合了多种模型的一般模型,可以参照原文说法:

The real lenses do not, however, exactly follow the designed
projection model. From the viewpoint of automatic calibration, it
would also be useful if we had only one model suitable for different
types of lenses.

原文链接:原文

第二,等距模型的公式中r代表rd,θ代表入射角,并不是出射角θd,真正的rd和θd的关系应为:在三角形OOcp’中,rd = f * tan(θd),设f=1可得到rd = tan(θd),显然不等于θd。

有人提出了质疑,有些博主又开始含糊其辞地解释为θ是个广义的概念,或者鱼眼模型里面经过了多次折射,并不只是一次,所以应该是θd等等,都不靠谱,让人更加疑惑。

后面还是找到了Kannala-Brandt 模型所在论文,看到了原始的表述是rd和θ的关系,而不是θd与θ的关系,总算明白了,而且看等距投影、正交投影等模型的表述,也是rd与θ的关系,所以还是opencv文档的表述有问题。opencv投影函数cv2.fisheye.initUndistortRectifyMap的实现方式就是按照以上公式推导,虽然只是一个变量名字的问题,并不影响结果,但也可能造成误导。

至于为什么这样表述,一方面可以认为是不严谨,一方面可能把畸变导致的结果θd和rd当成了同样的概念。虽然不影响结果,但第一次学习的时候,最好还是彻底搞清楚,尽量去追溯最原始的资料,比如原始论文,知乎和CSDN在公式表述上经常出现很多容易误导人的错误。对于鱼眼模型讲的最好的还是这篇博客https://blog.csdn.net/qq_39642978/article/details/112758040,前后两篇还介绍了opencv的矫正API和源码等,还手推了很多公式,可以参考。

最后说一下f=1的问题,其他博客也没有说清楚,并不是真的焦距是1,而是这里的公式推导用的球面和平面投影用的都是归一化球面和像平面,这样计算比较简单,而且各个变量之间的关系是和焦距无关的,这一步还没有用到内参,在求得归一化像平面坐标x’和y’后,转化为真正的焦平面坐标u,v才用到内参的焦距和偏移数据。

更新:

鱼眼镜头的成像原理到畸变矫正(完整版)_Sual-CSDN博客_鱼眼相机去畸变一文的博主Maples丶丶已经根据我在评论区提出的问题做了详细的更正,有点小激动,毕竟我是刚入门的菜鸟,人家算是资深博主,还有一种遇到知音的感觉哈哈,就喜欢一样求真务实的人~~不过我还是觉得这个是opencv官方文档的错误,后续应该继续向他们反馈~

Maples丶丶博客截图:
鱼眼投影模型理解以及opencv官方文档和同类文章勘误_第5张图片

你可能感兴趣的:(计算机视觉原创知识分享,opencv,计算机视觉,人工智能)