上一篇博客简要介绍了一下常用的张正友标定法的流程,其中获取了摄像机的内参矩阵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畸变校正函数内部做法是:在保证长宽比不变的情况下,对上面的图像取中间的ROI区域出来,类似进行“裁剪”操作,那么就会得到损失更多像素的输出图像啦,如下图(蓝色框)!

好了,说到这里,我们就把代码中的罪魁祸首找出来吧!先看一下initUndistortRectifyMap()函数的原型,如下图左,默认情况下,我们通常不会求取新的CameraMatrix,这样代码中会默认使用标定得到的CameraMatrix。而这个摄像机矩阵是在理想情况下没有考虑畸变得到的,所以并不准确,重要的是fx和fy的值会比考虑畸变情况下的偏大,会损失很多有效像素。我们可以通过这个函数getOptimalNewCameraMatrix ()求取一个新的摄像机内参矩阵,函数原型如下图右,注意函数上面的备注” Return the new camera matrix based on the free scaling parameter“,通过这个函数可以自行调整缩放比例。

       

在getOptimalNewCameraMatrix ()函数中,其中的一个输入参数为alpha∈(0,1),alpha的意义见上图,调节alpha的值能够控制得到的新矩阵中的fx和fy的大小,当alpha=1的时候,原图像中的所有像素能够得到保留,也就出现了上面校正后图像中的那些黑色的空洞区域。【注:cv模型中为alpha,fisheye模型中为balance,意义是一样的】

那么alpha是怎么样改变 f 值的,主要是getOptimalNewCameraMatrix ()中又调用了一个函数undistortPoints(),这个函数会在畸变图像中选取上下左右四个点进行畸变校正,具体请看源码。下面图片中我圈出的代码就在这个函数里面,里面具体的f1,f2,f3,f4的意思就与取的上下左右四个点有关,可以去看源代码,当然不明白了也可以问我。总之是在fmin和fmax之间进行插值计算 f,而通常balance(alpha)默认为0,f=fmax,焦距越大,视场越小,损失的有效像素越多。

畸变矫正及像素损失分析相关推荐

  1. Halcon: 畸变矫正与标定(1)

    1. Halcon相机标定和图像矫正     对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变.相机畸变主要分为径向畸变和切向畸变 ...

  2. halcon相机标定及畸变矫正

    1 halcon相机标定和图像矫正     对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变.相机畸变主要分为径向畸变和切向畸变, ...

  3. 一文讲透鱼眼相机畸变矫正,及目标检测项目应用

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1 个人介绍 大家好,我是潘大强. 目前博士毕业4年,主要从事智能安防行业. 之前也分享过AI从业的一 ...

  4. 项目讲解-AVM 3D 全景泊车-畸变矫正(1)

    1. 简介 这里对嵌入式部分的代码就不进行大量说明,主要对软件和算法部分进行讲解. 因为之前做完项目整理成了 doc 文档,这里直接复制过来,格式不太整齐,请谅解 这一篇只讲解一下畸变矫正,后面的历程 ...

  5. StereoRectify()函数定义及用法畸变矫正与立体校正

    畸变矫正是上一篇博文的遗留问题,当畸变系数和内外参数矩阵标定完成后,就应该进行畸变的矫正,以达到消除畸变的目的,此其一. 在该系列第一部分的博文中介绍的立体成像原理中提到,要通过两幅图像估计物点的深度 ...

  6. Halcon :畸变矫正与标定(2)

    相机标定 1.相机标定是什么 2.怎么使用halcon进行相机内外参标定? (1)搭建硬件 1.**相机连好电脑,用相机厂家软件打开相机,检查一下相机是否正常.** 2.**接下来使用halcon连接 ...

  7. 五、畸变矫正—让世界不在扭曲

    五.畸变矫正-让世界不在扭曲 这篇博文所要讲述的内容,是标定的主要用途之一:矫正摄像机的畸变.对于图像畸变矫正的方法,张正友教授也在其大作"A Flexible New Technique ...

  8. opencv:畸变矫正:透视变换算法的思想与实现

    畸变矫正 注意:虽然能够成功矫正但是也会损失了部分图像! 透视变换(Perspective Transformation) 概念: 透视变换是将图片投影到一个新的视平面(Viewing Plane), ...

  9. python opencv 摄像头标定_(五)单目摄像头标定与畸变矫正(C++,opencv)

    本文将梳理一种单目摄像头标定和矫正的方法,在梳理的过程中,首先使用网上离线的图片数据跑通流程,然后接入自己的camera,手动采集标定图像,实时矫正相机的畸变,然后输出矫正后的图像.全文基于Openc ...

最新文章

  1. sharepoint 2013 使用outlook 打开sharepoint 任务失败
  2. 全网最深刻的理解音频转码swr_convert(2019/10/29已补充修正)
  3. 160个CrackMe002
  4. yii mysql语法_yii2 + mysql 常用增删改查操作语法以及事务
  5. nginx+tomcat
  6. C++ 操作64位系统,默认读取Wow6432Node子键的解决方法。
  7. 结构体指针需要申请指针内存,结构体对象不需要申请对象内存
  8. HDU - 4497 GCD and LCM 数论gcd
  9. 【计算机网络复习 数据链路层】3.3.2 差错控制(纠错编码)
  10. GBDT原理及利用GBDT构造新的特征-Python实现
  11. 部署集群linux Oracle VM VirtualBox vagrant
  12. Spring的9种设计模式(二)
  13. 【正版软件】Virtual Display Manager 虚拟显示器布局配置管理软件
  14. 蓝牙音乐之AVRCP常用指令介绍
  15. SVG—最简单的SVG动画
  16. html页面图片可点击事件,html中如何给图片添加点击事件的详解
  17. 《Python编程:从入门到实践》---项目2
  18. 如何记忆和使用PNP和NPN?
  19. xxl-job定时任务
  20. 海鸣威《离开为了更好的回来》 MV首播感心动耳

热门文章

  1. ISAR雷达成像技术问题
  2. CocosCreator之KUOKUO带你入门3D小游戏-躲避方块
  3. 微信域名检测、防封,微信跳转技术揭秘(一)
  4. KuickDeal助力文都教育实现智能获客销售
  5. java语音_java实现语音
  6. 蜘蛛牌窗口-游戏规则和说明
  7. 【51nod】小明爱集合【set】
  8. 拆解问题的技术-摘录
  9. MFC:如何利用C++使得输出文本颜色、字体多变
  10. 程序员的算法趣题Q07: 日期的二进制转换