上一篇博客简要介绍了一下常用的张正友标定法的流程,其中获取了摄像机的内参矩阵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函数进行畸变校正。
今天要说的第二点就是做过畸变校正的同学都知道,畸变校正后的图像会损失很多像素,这是为什么呢?接下来就以常见的桶形畸变为例分析一下:由于我目前手头的相机畸变程度并不明显(之前用广角