【图像】【OpenCV鱼眼矫正】三、鱼眼矫正原理讲解
目录
- 一、鱼眼矫正原理讲解
- 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轴) 的夹角。如下:
图中,左下角的theta1
由atan(r)
计算得来,而右边的theta2
是点(x, y, z)
的入射角,它与左下角的theta1
角度相等。
有的读者会问,图中标注的是真正的相机坐标,而我们上面式子中的是归一化后的相机坐标,算出来的theta
能一样吗?答案是肯定的。观察发现,我们用到的只是x、y、z之间的比例关系,而不管归一化与否,它们的比例关系都是一样的。
至此,不论是像素坐标(i, j)
,还是相机坐标(x, y, z)
,亦或是入射角theta = theta1 = theta2
,我们计算的都是无畸变情况下的值。
然后,下一步将是无畸变与畸变的分界点!
根据Juho Kannala 和 Sami 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鱼眼矫正】三、鱼眼矫正原理讲解相关推荐
- 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现
近期,因为要实现经过多个控制点的曲线拟合,研究起了曲线拟合算法.综合搜索到的资料,发现Bezier曲线拟合算法是一种相对较容易实现.且拟合的效果较好的算法.关于Bezier曲线原理,请参照(Bezie ...
- 鱼眼摄像头的畸变矫正方法-python+opencv
鱼眼摄像头畸变校正的方法: 1. 棋盘矫正法 2. 经纬度矫正法. 相机为什么会出现畸变? 当前相机的畸变主要分为径向畸变和切向畸变两种. 径向畸变产生的原因:相机的光学镜头厚度不均匀,离镜头越远场景 ...
- Intel RealSense T265鱼眼相机图像获取并矫正畸变(Unity)
1.添加RsDevice: 2.设置开启鱼眼相机: 3.新建RsStreamTextureRendererFisheye.cs和Fisheye.shader: using Intel.RealSens ...
- 双摄像头立体成像(三)-畸变矫正与立体校正
双摄像头立体成像(三)-畸变矫正与立体校正 畸变矫正是上一篇博文的遗留问题,当畸变系数和内外参数矩阵标定完成后,就应该进行畸变的矫正,以达到消除畸变的目的,此其一. 在该系列第一部分的博文中介绍的立体 ...
- 【OpenCV】中的鱼眼相机及其标定
1. 鱼眼镜头特性与镜头分类 普通镜头和针孔相机在数学模型上可以等价对待,都是射影变换(Perspective transform): 鱼眼镜头受到水下斯涅耳窗口现象的启发,采用不同的投影方式,来得到 ...
- 利用opencv实现图像马赛克处理的三种方法
前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理.示例.问题及问题的解决方案. 方法一 原理介绍:利用resize()将图片先缩小,再放大 代码示例: i ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
- 利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 对图像进行旋转矫正,关键是要获取旋转角度是多少! ...
- ISP(图像信号处理)算法概述、工作原理、架构、处理流程
目录 ISP的主要内部构成:ISP内部包含 CPU.SUP IP(各种功能模块的通称).IF 等设备 ISP的控制结构:1.ISP逻辑 2.运行在其上的firmware ISP上的Firmwar ...
最新文章
- Field XXXX input value is longer than screen field-BDC
- JavaFx实现-渐变效果之一
- 问题合集 ------- 用 Eclipse 平台进行 C/C++ 开发
- Linux基础命令---cpio
- 漫画:什么是MD5算法
- mvvm绑定checkbox wpf_LoxodonFramework 数据双向绑定 通过控制数据流向防止更新死循环...
- Jenkins中Publish Over SSH插件使用
- python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
- python 安装xlwt失败_安装python库xlwt的时候遇到超时的情况。
- 快速排序_two-powinters思想
- 软件测试报告 图书管理系统,图书管理系统报告 图书馆管理系统报告
- 解决Win7系统无法睡眠问题
- 嗯,春招两次腾讯面试都挂二面了,分享下我失败+傻傻的面试经历
- 基于R统计分析——样本与分布
- python泊松_python – 泊松过程的测试
- U-net网络框架 学习笔记
- 使用echarts画日历热力图
- 睡眠质量不好怎么改善,几个助眠好物帮助你睡安稳觉
- shell之awk命令详解
- Shipping Grants
热门文章
- Spring Data MongoRepository 的 in 查询操作
- Qt音视频开发02-海康sdk解码(支持句柄/回调/GPU模式/支持win/linux)
- 双向带头循环链表的(增删查改)的实现
- 【教你两招!】弄懂3DMAX如何渲染通道图像
- javax.servlet.ServletException: Servlet execution threw an exception org.apache.tomcat.websocket.se
- 背包问题的解密及破解
- html中outline属性,css 轮廓(outline)属性是如何使用的
- 主机WiFi上网 虚拟机NAT方式上网
- TiDB实战篇-TiDB配置
- BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(四)