OpenCV畸变校正原理以及损失有效像素原理分析
上一篇博客简要介绍了一下常用的张正友标定法的流程,其中获取了摄像机的内参矩阵K,和畸变系数D。
1.在普通相机cv模型中,畸变系数主要有下面几个:(k1; k2; p1; p2[; k3[; k4; k5; k6]] ,其中最常用的是前面四个,k1,k2为径向畸变系数,p1,p2为切向畸变系数。
2.在fisheye模型中,畸变系数主要有下面几个(k1,k2,k3,k4).
因为cv和fisheye的镜头畸变模型不一样,所以畸变系数也会有所不同,具体在畸变校正时的公式也不同,具体公式请参见opencv2.0和3.0的官方文档。
OpenCV中对畸变图像进行畸变校正主要用的函数有UndistortImage()函数,以及initUndistortRectifyMap()结合remap()函数。其实UndistortImage()就是
initUndistortRectifyMap()和remap()的简单组合,效果是一样的。
但是有一点是:当你有很多畸变图像需要较正时,用UndistortImage()函数的缺点就暴露了。因为畸变坐标映射矩阵mapx和mapy只需要计算一次就足够了,
而重复调用UndistortImage()只会重复计算mapx和mapy,严重影响程序效率。因此当有多张图片要畸变校正时,建议使用一次initUndistortRectifyMap(),
获取畸变坐标映射矩阵mapx和mapy后,作为remap函数的输入,多次调用remap函数进行畸变校正。
今天要说的第二点就是做过畸变校正的同学都知道,畸变校正后的图像会损失很多像素,这是为什么呢?接下来就以常见的桶形畸变为例分析一下:
由于我目前手头的相机畸变程度并不明显(之前用广角镜头的时候畸变程度相当明显)。因此就从网上找一些图片作为例子以便说明,这里引用一下图片来源
http://www.developersite.org/904-45591-%E6%A0%87%E5%AE%9A。
畸变原图如下:
畸变校正后的图如下:
相信大家已经可以看到了,由于桶形畸变的特征是,远离图像中心的地方成像放大率小,因此越远离图像中心的位置畸程度越明显,像点越向内移动。畸变校正后,原本挤在
一起的像素点们被校正到原来的位置,就得到上面的图像。同时由于四周的像素被拉伸,会造成四周出现模糊的情况。
得到上述图像后很自然想到的是把四周的黑色区域裁掉,只留下中间的图像区域。如下图(红色框):
那么问题来了,这样做的话输出图像的长宽比和输入图像的长宽比就不一致了。因此opencv畸变校正函数内部做法是:在保证长宽比不变的情况下,对上面的图像进行裁剪,那么就会得到损失更多像素的输出图像啦,如下图(蓝色框)!
好了,说到这里,我们就把代码中的罪魁祸首找出来吧!
对,就是它!把它揪出来!这条语句在initUndistortRectifyMap()函数中可以找到,里面具体的f1,f2,f3,f4的意思就请同学你去看源代码了,当然不明白了也可以问我。
总之是在fmin和fmax之间进行插值计算f,而通常balance默认为0,f=fmax,焦距越大,视场越小,损失的有效像素越多。
好了,夜已深,今天就到这里。
OpenCV畸变校正原理以及损失有效像素原理分析的更多相关文章
- OpenCV畸变校正源代码分析
图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包过普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...
- OpenCV两种畸变校正模型源代码分析以及CUDA实现
图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...
- JAVA浮点数计算精度损失底层原理与解决方案
浮点数会有精度损失这个在上大学的时候就已经被告知,但是至今完全没有想明白其中的原由,老师讲的时候也是一笔带过的,自己也没有好好琢磨.终于在工作的时候碰到了,于是google了一番. 问题: 对两个do ...
- 【OpenCV】摄像机标定+畸变校正
摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...
- [翻译]利用顶点位移的VR畸变校正
文章英文原网址: http://www.gamasutra.com/blogs/BrianKehrer/20160125/264161/VR_Distortion_Correction_using_V ...
- 利用顶点位移进行VR畸变校正
VR开发的最大挑战之一是对高帧率与高分辨率结合的要求.我们通过把顶点转化为“镜头空间”,删除了需要全屏渲染的纹理,这样就可以大规模提高手机性能. 下面的技术使用谷歌的Cardboard Unity S ...
- 车牌定位与畸变校正(python3.7,opencv4.0)
一.前言及思路简析 目前车牌识别系统在各小区门口随处可见,识别效果貌似都还可以.查阅资料后,发现整个过程又可以细化为车牌定位.畸变校正.车牌分割和内容识别四部分.本篇随笔主要介绍车牌定位及畸变校正两部 ...
- Matlab 摄像机标定+畸变校正
博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...
- 支持向量机原理(四)SMO算法原理
支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...
随机推荐
- Java对象序列化的使用和定制
序列化的概念及使用场合 序列化就是把对象转化为字节序列并持久化保存,可以保存在内存中.磁盘文件系统,甚至通过网络传递,并能够在以后将这个字节序列完全恢复为原来的对象. 对象序列化的概念引入Java是为 ...
- 基于 Koa平台Node.js开发的KoaHub.js的输出json到页面代码
koahub-body-res koahub body res Format koa's respond json. Installation $ npm install koahub-body-re ...
- 3385: [Usaco2004 Nov]Lake Counting 数池塘
3385: [Usaco2004 Nov]Lake Counting 数池塘 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 22 Solved: 21 ...
- 1002: [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2609 Solved: 1450[Submit][Statu ...
- PowerDesigner建模应用(二)逆向工程,导出PDM文件前过滤元数据(表、视图、存储过程等)
在上一篇文章<PowerDesigner建模应用(一)逆向工程,配置数据源并导出PDM文件>步骤二中导出了目标数据库对应的PDM文件, 该文件中展示出了所有表的信息与关系. 某些业务场景下 ...
- solr 分词词库管理思路
solr 分词词库管理思路 大概有以下几种思路: 1. 自定义 SolrRequestHandler 由 SolrRequestHandler 来进行对分词器,进行A)词库加载B)动态添 ...
- 持续集成接口自动化-jmeter+ant+jenkins(一)
ant 批量执行Jmeter 一.环境准备 1.JDK环境:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.A ...
- python 接口自动化测试(一)
一.测试需求描述 对服务后台一系列SOAP接口功能测试 参数传入:根据接口描述构造不同的参数输入值(Json格式) 二.程序设计 通过Excel配置具体的测试用例数据 保存参数为Json格式,预写入预 ...
- spring项目中dubbo相关的配置文件出现红叉的问题
近来在eclipse中导入了一个web项目,但是发现项目上有红色的叉号. 原来是spring中关于dubbo的配置文件报错了. Multiple annotations found at this l ...
- 技术方案:在外部网址调试本地js(基于fiddler)
1 解决的问题 1) 场景1:生产环境报错 对前台开发来说,业务逻辑都在js中,所以报错90%以上都是js问题. 如果生产环境出现报错,但是测试环境正常.这时修改了代码没有环境验证效果, ...