目录

  • 一、鱼眼矫正原理讲解
    • 1. 像素坐标转化为相机坐标
    • 2. 无畸变相机坐标 与 畸变后相机坐标 的 对应关系

参考资料:

链接:https://pan.baidu.com/s/19BK9HbRBYtFCjdR0qSIv2Q
提取码:eu2s

根据前面两篇文章,我们已经知道鱼眼矫正最重要的函数是fisheye::initUndistortRectifyMap(),它能得到map1矩阵,其作用是:

map1是一个2通道矩阵,它在(i, j)处的二维向量元素(u, v) = (map1(i, j)[0], map1(i, j)[1])的意义如下:
将畸变图像中(u, v) = (map1(i, j)[0], map1(i, j)[1])的元素,复制到(i, j)处,就得到了无畸变图像。

那么,fisheye::initUndistortRectifyMap()是如何根据(i, j)算出(u, v)的呢?
OpenCV官方给出了如下公式:

其中,(i, j)是无畸变图的像素坐标,而式①中的(i, j, 1)(i, j)的齐次坐标;

式①的iR是相机内参

而最后式⑦中的(u, v),就是无畸变图中(i, j)位置对应的畸变图中的点(u, v)


下面对以上公示做详细介绍。

一、鱼眼矫正原理讲解

1. 像素坐标转化为相机坐标

在阅读本节前,请先学习世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系,本节认为读者已掌握基础知识。

首先,我们知道相机坐标系像素坐标系的转化关系如下:

注:

下面统一将“现实三维世界中的点在相机坐标系下的坐标”简写做“相机坐标”;将“二维图片中的像素坐标系下的坐标”简写作“像素坐标”。

在上述式①中,iR是内参矩阵的逆,则可式①得到的[Xc, Yc, Zc],实际上是真正的相机坐标的归一化坐标,即:

然而,我们用[Xc, Yc, Zc],只是用到了它们之间的比例关系。因此,到底是否经过了归一化,其实并不重要,因为比例关系都一样。

至此,我们根据无畸变图中的像素坐标(i, j),得到了它在无畸变条件下,本应该对应的归一化相机坐标(Xc, Yc, Zc)

2. 无畸变相机坐标 与 畸变后相机坐标 的 对应关系

假设现实世界中一点(x, y, z)在相机坐标系下的位置如下图所示,那么,根据上式②③④,我们得到的theta = atan(r)实际上就是入射角,即 点(x, y, z)与相机中心的连线相机光轴(Z轴) 的夹角。如下:

图中,左下角的theta1atan(r)计算得来,而右边的theta2点(x, y, z)的入射角,它与左下角的theta1角度相等。

有的读者会问,图中标注的是真正的相机坐标,而我们上面式子中的是归一化后的相机坐标,算出来的theta能一样吗?答案是肯定的。观察发现,我们用到的只是x、y、z之间的比例关系,而不管归一化与否,它们的比例关系都是一样的。

至此,不论是像素坐标(i, j),还是相机坐标(x, y, z),亦或是入射角theta = theta1 = theta2,我们计算的都是无畸变情况下的值。

然后,下一步将是无畸变与畸变的分界点!


根据Juho KannalaSami S. Brandt的大作 《A Generic Camera Model and Calibration Method for Conventional, Wide-Angle, and Fish-Eye Lenses》,我们可以由无畸变入射角theta,配合畸变系数,得到畸变后的r!为了将这个r无畸变时的r区分,我们把这个畸变后的r记作r_d(d表示畸变)。

即,r_d = k1 · theta + k2 · theta ^ 3 + k3 · theta ^ 5 + k4 · theta ^ 7 + k5 · theta ^ 9

这也就是式⑤。

至此,我们就得到了畸变情况下的r_d。

畸变点的意义如下所示:

在无畸变情况下,上图中,无畸变图中的黑色像素点,应该由现实世界中黑色的无畸变点投影而来;

但是,在鱼眼畸变情况下,上图中,无畸变图中的黑色像素点,应该对应着现实世界中的红色点投影而来。

那么,我们只要找到红色点在畸变图中的位置,然后把它放到黑色无畸变像素点的位置就可以了。

现在,我们能得到红色点对应的r_d,以及黑色点对应的r,那么,令比例因子scale = r_d / r,那么scale · a就应该是红色点在x方向的相机坐标,scale · b就应该是红色点在y方向的相机坐标。

得到了红色点的相机坐标,再根据像素坐标 = 内参 x 相机坐标,就能得到现实世界中红色点对应的畸变图像中的像素坐标,即式⑦。如下:

**至此,我们就从最开始的无畸变图中的像素点(i, j),经过一路推导,推算到了它对应的畸变图中的像素点(u, v),只要把(u, v)像素复制到(i, j)处,就能得到矫正后的图像。

注:

其实博主对于比例因子scale的原理和作用并不是很清楚,至于为什么 “scale · a就应该是红色点在x方向的相机坐标、而scale · b就应该是红色点在y方向的相机坐标” 也没太搞明白。但这一定是有原理可循的,也希望看到这里的读者能在评论区答疑解惑。

【图像】【OpenCV鱼眼矫正】三、鱼眼矫正原理讲解相关推荐

  1. 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现

    近期,因为要实现经过多个控制点的曲线拟合,研究起了曲线拟合算法.综合搜索到的资料,发现Bezier曲线拟合算法是一种相对较容易实现.且拟合的效果较好的算法.关于Bezier曲线原理,请参照(Bezie ...

  2. 鱼眼摄像头的畸变矫正方法-python+opencv

    鱼眼摄像头畸变校正的方法: 1. 棋盘矫正法 2. 经纬度矫正法. 相机为什么会出现畸变? 当前相机的畸变主要分为径向畸变和切向畸变两种. 径向畸变产生的原因:相机的光学镜头厚度不均匀,离镜头越远场景 ...

  3. Intel RealSense T265鱼眼相机图像获取并矫正畸变(Unity)

    1.添加RsDevice: 2.设置开启鱼眼相机: 3.新建RsStreamTextureRendererFisheye.cs和Fisheye.shader: using Intel.RealSens ...

  4. 双摄像头立体成像(三)-畸变矫正与立体校正

    双摄像头立体成像(三)-畸变矫正与立体校正 畸变矫正是上一篇博文的遗留问题,当畸变系数和内外参数矩阵标定完成后,就应该进行畸变的矫正,以达到消除畸变的目的,此其一. 在该系列第一部分的博文中介绍的立体 ...

  5. 【OpenCV】中的鱼眼相机及其标定

    1. 鱼眼镜头特性与镜头分类 普通镜头和针孔相机在数学模型上可以等价对待,都是射影变换(Perspective transform): 鱼眼镜头受到水下斯涅耳窗口现象的启发,采用不同的投影方式,来得到 ...

  6. 利用opencv实现图像马赛克处理的三种方法

    前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理.示例.问题及问题的解决方案. 方法一 原理介绍:利用resize()将图片先缩小,再放大 代码示例: i ...

  7. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

  8. 利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 对图像进行旋转矫正,关键是要获取旋转角度是多少! ...

  9. ISP(图像信号处理)算法概述、工作原理、架构、处理流程

    目录 ISP的主要内部构成:ISP内部包含 CPU.SUP IP(各种功能模块的通称).IF 等设备 ISP的控制结构:1.ISP逻辑    2.运行在其上的firmware ISP上的Firmwar ...

最新文章

  1. Field XXXX input value is longer than screen field-BDC
  2. JavaFx实现-渐变效果之一
  3. 问题合集 ------- 用 Eclipse 平台进行 C/C++ 开发
  4. Linux基础命令---cpio
  5. 漫画:什么是MD5算法
  6. mvvm绑定checkbox wpf_LoxodonFramework 数据双向绑定 通过控制数据流向防止更新死循环...
  7. Jenkins中Publish Over SSH插件使用
  8. python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
  9. python 安装xlwt失败_安装python库xlwt的时候遇到超时的情况。
  10. 快速排序_two-powinters思想
  11. 软件测试报告 图书管理系统,图书管理系统报告 图书馆管理系统报告
  12. 解决Win7系统无法睡眠问题
  13. 嗯,春招两次腾讯面试都挂二面了,分享下我失败+傻傻的面试经历
  14. 基于R统计分析——样本与分布
  15. python泊松_python – 泊松过程的测试
  16. U-net网络框架 学习笔记
  17. 使用echarts画日历热力图
  18. 睡眠质量不好怎么改善,几个助眠好物帮助你睡安稳觉
  19. shell之awk命令详解
  20. Shipping Grants

热门文章

  1. Spring Data MongoRepository 的 in 查询操作
  2. Qt音视频开发02-海康sdk解码(支持句柄/回调/GPU模式/支持win/linux)
  3. 双向带头循环链表的(增删查改)的实现
  4. 【教你两招!】弄懂3DMAX如何渲染通道图像
  5. javax.servlet.ServletException: Servlet execution threw an exception org.apache.tomcat.websocket.se
  6. 背包问题的解密及破解
  7. html中outline属性,css 轮廓(outline)属性是如何使用的
  8. 主机WiFi上网 虚拟机NAT方式上网
  9. TiDB实战篇-TiDB配置
  10. BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(四)