上一篇博客简要介绍了一下常用的张正友标定法的流程,其中获取了摄像机的内参矩阵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畸变校正原理以及损失有效像素原理分析的更多相关文章

  1. OpenCV畸变校正源代码分析

    图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包过普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...

  2. OpenCV两种畸变校正模型源代码分析以及CUDA实现

    图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...

  3. JAVA浮点数计算精度损失底层原理与解决方案

    浮点数会有精度损失这个在上大学的时候就已经被告知,但是至今完全没有想明白其中的原由,老师讲的时候也是一笔带过的,自己也没有好好琢磨.终于在工作的时候碰到了,于是google了一番. 问题: 对两个do ...

  4. 【OpenCV】摄像机标定+畸变校正

      摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...

  5. [翻译]利用顶点位移的VR畸变校正

    文章英文原网址: http://www.gamasutra.com/blogs/BrianKehrer/20160125/264161/VR_Distortion_Correction_using_V ...

  6. 利用顶点位移进行VR畸变校正

    VR开发的最大挑战之一是对高帧率与高分辨率结合的要求.我们通过把顶点转化为“镜头空间”,删除了需要全屏渲染的纹理,这样就可以大规模提高手机性能. 下面的技术使用谷歌的Cardboard Unity S ...

  7. 车牌定位与畸变校正(python3.7,opencv4.0)

    一.前言及思路简析 目前车牌识别系统在各小区门口随处可见,识别效果貌似都还可以.查阅资料后,发现整个过程又可以细化为车牌定位.畸变校正.车牌分割和内容识别四部分.本篇随笔主要介绍车牌定位及畸变校正两部 ...

  8. Matlab 摄像机标定+畸变校正

    博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...

  9. 支持向量机原理(四)SMO算法原理

    支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...

随机推荐

  1. Python3.5 numpy,scipy,安装

    不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...

  2. vue移动端框架到底哪家强

    Weex 2016年4月21日,阿里巴巴在Qcon大会上宣布跨平台移动开发工具Weex开放内测邀请. Weex 是一套简单易用的跨平台开发方案,能以 web 的开发体验构建高性能.可扩展的 nativ ...

  3. 配置Server Side TAF

    实验环境:Oracle 11.2.0.4 RAC 参考MOS文档: How To Configure Server Side Transparent Application Failover (文档 ...

  4. npm学习总结

    1.npm run [scripts name]的作用及意义: npm 局部安装的工具包不能像全局安装那样直接执行命令行,但可写成命令行执行语句,通过npm run来运行,该命令可将node_modu ...

  5. OpenFlow硬件交换机制作及刷机教程

    1.目的 将普通路由器升级成为一台支持OpenFlow的交换机. 具体哪些路由器可以刷OpenFlow可以参考:OpenWRT:http://wiki.openwrt.org/toh/start#su ...

  6. CentOS 7安装配置FTP服务器

    CentOS 7下FTP服务器的安装配置. 假设我们有以下要求 路径 权限 备注 /ftp/open 公司所有人员包括来宾均可以访问 只读 /ftp/private 仅允许Alice.Jack.Tom ...

  7. js手写图片查看器(图片的缩放、旋转、拖拽)

    在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...

  8. 解决error104 connection reset by peer;socket error问题

    这个问题原因有两个: 1.因为你访问网站太多次,所以被网站管理员给禁止访问了. 解决方法: 1.延长time.sleep时间 2.设置代理 2.根本没有这个网站.(打开链接检查一下!!!)

  9. Cordova框架基本原理

    最近在做混编项目,也是从项目里开始接触Cordova框架,网上很多帖子都总结的很好,我还是要总结一下,便于加深一下. Cordova框架是一个可以让JS与原生代码(包括 Android 的 java, ...

  10. linux下mysql的大小写是否区分设置

    转:http://blog.csdn.net/qq_29246225/article/details/52293549 一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分 ...