相机标定(4) 矫正畸变 undistort()和initUndistortRectifyMap()

 从摄像机成像畸变的产生于是其“天生”的,不可避免的,这主要是由于透镜成像原理导致的。其畸变的原理可以参考相机模型)。它的畸变按照原理可以分解为切向畸变和径向畸变。

畸变校正
opencv提供了可以直接使用的矫正算法,即通过calibrate Camera()得到的畸变系数,生成矫正后的图像。我们可以通过undistort()函数一次性完成;也可以通过initUndistortRectifyMap()和remap()的组合来处理。

1、initUndistortRectifyMap()和remap()
void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs,
                           InputArray R, InputArray newCameraMatrix,
                           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()函数:

void remap( InputArray src, OutputArray dst,
                         InputArray map1, InputArray map2,
                         int interpolation, int borderMode=BORDER_CONSTANT,
                         const Scalar& borderValue=Scalar());
第一个参数:输入图像,即原图像,需要单通道8位或者浮点类型的图像
第二个参数:输出图像,即目标图像,需和原图形一样的尺寸和类型
第三个参数:它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等
第四个参数:它有两种可能表示的对象:(1)若map1表示点(x,y)时,这个参数不代表任何值;(2)表示                                     CV_16UC1,CV_32FC1类型的Y值
第五个参数:插值方式,有四种插值方式:
(1)INTER_NEAREST——最近邻插值

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

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

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

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

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

2、undistort()函数
void undistort( InputArray src, //输入原图
                             OutputArray dst,//输出矫正后的图像
                             InputArray cameraMatrix,//内参矩阵
                             InputArray distCoeffs,//畸变系数
                             InputArray newCameraMatrix=noArray() );
 有时不需要矫正整个图像,而仅仅计算图像中特定点的位置,这是可以使用undistortPoints函数:

void undistortPoints( InputArray src, OutputArray dst,
                                   InputArray cameraMatrix, InputArray distCoeffs,
                                   InputArray R=noArray(), InputArray P=noArray());
undistortPoints函数与undistort()的区别在于:参数src,dst是二维点的向量,std::vector<cv::Point2f> ,P对应cameraMatrix。该参数与立体校正方面的使用有关。调用方式:

:undistortPoints(inputDistortedPoints, outputUndistortedPoints, cameraMatrix, distCoeffs, cv::noArray(), cameraMatrix);
————————————————
版权声明:本文为CSDN博主「菜鸟知识搬运工」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30815237/article/details/87622654

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当进行相机标定时,通常需要进行畸变矫正以提高图像质量。在MATLAB中,可以使用相机标定工具箱(Camera Calibration Toolbox)来实现相机标定畸变矫正。 以下是一个简单的MATLAB代码示例,用于相机标定畸变矫正: ```matlab % 步骤1:准备标定板图像和对应的世界坐标点 imageFileNames = {'image1.jpg', 'image2.jpg', 'image3.jpg', ...}; % 标定板图像文件名 squareSize = 25; % 标定板方格尺寸(单位:毫米) worldPoints = generateCheckerboardPoints(boardSize, squareSize); % 生成标定板上的世界坐标点 % 步骤2:检测标定板角点 [imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames); % 步骤3:进行相机标定 params = estimateCameraParameters(imagePoints, worldPoints, 'EstimateSkew', false, 'EstimateTangentialDistortion', true); % 步骤4:显示标定结果 figure; showExtrinsics(params); % 步骤5:读取待校正图像 image = imread('test_image.jpg'); % 步骤6:进行畸变矫正 undistortedImage = undistortImage(image, params); % 步骤7:显示校正结果 figure; imshowpair(image, undistortedImage, 'montage'); ``` 这段代码中,首先需要准备标定板图像和对应的世界坐标点。然后,通过`detectCheckerboardPoints`函数检测标定板角点,并使用`estimateCameraParameters`函数进行相机标定。接下来,可以使用`showExtrinsics`函数显示标定结果。最后,可以使用`undistortImage`函数对待校正图像进行畸变矫正,并使用`imshowpair`函数显示校正结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值