首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

相机标定和图像的畸变校正

笔者最近被图像的畸变校正,折磨的生不如死,本来茂密的头发,如今也是日渐稀疏,为了广大做图像处理算法的同学们少掉几根头发,也作为笔者第一篇公众号文章,所以选择了计算机视觉的开端,相机的标定和图像畸变校正。

所谓相机标定,其实是为了建立图像中的像素坐标和真实三维世界坐标的联系,同样标定同时也得到了畸变系数,为畸变校正做准备。

相机的小孔模型的投影变化过程如上述三图所示,从世界坐标系到相机坐标系,就是简单的刚性变化,包含平移和旋转过程,相机坐标系到图像坐标系,则变成了依据焦距来进行的投影过程,图像坐标系和像素坐标系之间的变换则又是跟相机的每个像素传感器的尺寸dx和dy有关,这一整套的投影过程是计算机视觉开端的入门必修内容,限于篇幅笔者就不再详述,具体推到过程,网上比比皆是。

根据上述的投影变换过程,我们利用一些特殊的可以检测到的世界点和像素点,建立它们之间的联系,就可以得到我们想要的相机内外参数。通常的相机标定的方法普遍采用的是张正友标定法,为了得到准确的世界坐标,采用下图所示的棋盘格作为世界坐标的参考物,因为棋盘格角点特征明显,易于检测,以棋盘所在平面为(x,y)坐标,平面所在轴z为0处,这样每个角点的坐标就可以轻易得知,再根据上图所示的投影关系,就可以建立方程组,通过最小二乘或其他优化方法,求解相机的内外参数和畸变系数。

具体的实现方法也很简单,matlab有非常成熟的相机标定的工具箱,如下图所示,将拍到的棋牌格图像根据操作传进app,选择径向畸变和切向畸变系数,calibrate即可完成,对于一般分辨率较小的图像,选择2个径向畸变因子即可,但是对于分辨率较大的图像,笔者还是较为推荐使用opencv函数进行相机标定,具体原因下文详述。

opencv关于相机的标定的函数,封装的已经非常的完好,各种API接口都很适于初学者使用,不得不说,opencv是图像领域最有用最牛逼的开源库了。吹完opencv接下来说说标定的函数。

接下来就是笔者苦熬三天发现的畸变校正的问题。

接上文的小孔投影模型,其实,因为光学镜头的制作精度和安装误差,都会产生畸变。畸变主要分为径向畸变和切向畸变两种,其中径向畸变是镜头畸变的一种主要形式。畸变的数学模型为:

因为镜头的畸变效果,从镜头中心向两端,畸变逐渐变大,从上变的棋盘格图像就能看出,四个角(距离镜头中心最远的四个点)其畸变最为明显。而径向畸变系数k1,k2,k3,k4,k5,k6其表示形式,其实是根据高斯展开的一种近似,也就是说系数越多,对原有模型越逼近。

笔者在最开始做畸变校正时,参考网上的代码,利用opencv中的畸变矫正函数:initUndistortRectifyMap()和remap()函数的结合,完成畸变校正,利用畸变校正函数求解去畸变后的各个位置上像素的坐标关系,利用remap对图像进行重新映射,但是,因为initUndistortRectifyMap()函数内部的设定,为了校正后图像的好看性,强制的将有黑边的部分截去,使得最终图像的有效像素损失。

为了解决有效损失的问题,笔者又查到,利用getOptimalNewCameraMatrix()函数,可以重置相机的内参,其具体原理,其实就是增大相机主点和减小焦距,这样在求解映射关系的时候,就不会有有效像素的损失。但是加入这个函数之后,虽然不再有有效像素的损失,图像的四个角还是有很强的畸变。

笔者一度感到绝望,反复测试,甚至怀疑是标定出现问题,而重新标定,现在想来,做事情的时候一定要想明白再做,否则一头雾水,像个没头的苍蝇,白白浪费时间,书归正题,绝望之下,笔者抛弃了opencv封装好的函数,手写一个畸变校正的函数,但是在笔者以为大功告成之际,得到的结果依然跟调用函数出的结果一摸一样(证明自己写的代码没问题还是很开心),所以笔者重新了解了一波畸变校正的原理,发现,网上这些成功的例子,都是因为他们的 图像的分辨真的非常小,高和宽超过1000都算很大了,更何况他们的畸变真的很小,所以他们的畸变系数在标定的时候只算到了k2,而我的图像分辨率为1520*2048,k2的系数真的不能满足对图像边角的校正,因此,采用opencv的标定函数,将系数设置到k6,求接出k1-k6,再重新计算映射关系,最终终于大功告成。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G17M3I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券