opencv提供了可以直接使用的矫正算法,我们可以通过undistort()函数一次性完成;也可以通过initUndistortRectifyMap()和remap()的组合来处理。

与传统去畸变的思路不同,opencv的方案实际是在计算对理想图进行加畸变到实际图的映射,在通过remap,计算去畸变后的图相对于原图的位置,最终得到去畸变的图。

种方式有两个优点:

1、增加畸变比去畸变公式简单,不需要迭代计算,速度快,精度高;
 2、 remap时去畸变的目标图的像素点是整数,对应的原图上的位置为浮点数,通过简单的差值计算能够计算到较为精确的目标值,提高了图像的连续性,不会造成裂纹或重叠的情况。
 initUndistortRectifyMap()和remap()
 1.voidinitUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs,
 2. InputArray R, InputArray newCameraMatrix,
 3. Size size, int m1type, OutputArray map1, OutputArray map2 );

函数说明:

这个函数用于计算无畸变和修正转换关系,为了重映射,将结果以映射的形式表达。无畸变的图像看起来就像原始的图像,就像这个图像是用内参为newCameraMatrix的且无畸变的相机采集得到的。

在单目相机例子中,newCameraMatrix一般和cameraMatrix相等,或者可以用cv::getOptimalNewCameraMatrix来计算,获得一个更好的有尺度的控制结果。

在双目相机例子中,newCameraMatrix一般是用cv::stereoRectify计算而来的,设置为P1或P2。 此外,根据R,新的相机在坐标空间中的取向是不同的。例如,它帮助配准双目相机的两个相机方向,从而使得两个图像的极线是水平的,且y坐标相同(在双目相机的两个相机谁水平放置的情况下)。 该函数实际上为反向映射算法构建映射,供反向映射使用。也就是,对于在已经修正畸变的图像中的每个像素(u,v),该函数计算原来图像(从相机中获得的原始图像)中对应的坐标系。

函数输出得到map1和map2,然后使用remap()函数:
1.voidremap( InputArray src, OutputArray dst,
2. InputArray map1, InputArray map2,
3.int interpolation, int borderMode=BORDER_CONSTANT,
4.const Scalar& borderValue=Scalar());

1、第一个参数:输入图像,即原图像,需要单通道8位或者浮点类型的图像
2、第二个参数:输出图像,即目标图像,需和原图形一样的尺寸和类型

3、第三个参数:它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等

4、第四个参数:它有两种可能表示的对象:(1)若map1表示点(x,y)时,这个参数不代表任何值;(2)表示 CV_16UC1,CV_32FC1类型的Y值

5、第五个参数:插值方式,有四种插值方式:

(1)INTER_NEAREST——最近邻插值

(2)INTER_LINEAR——双线性插值(默认)

(3)INTER_CUBIC——双三样条插值(默认)

(4)INTER_LANCZOS4——lanczos插值(默认)

6、六个参数:边界模式,默认BORDER_CONSTANT

7、第七个参数:边界颜色,默认Scalar()黑色