opencv图像畸变矫正:源码学习

参考资料:相机标定(4) 矫正畸变 undistort()和initUndistortRectifyMap()

背景:opencv提供了直接进行畸变矫正的代码,因在项目中需要使用畸变矫正,因此研究一下opencv中畸变矫正的相关接口与代码,便于学习提升与二次开发。

1、畸变矫正原理

opencv在文档中对相机标定与畸变矫正的原理做了简单介绍,可参考链接:opencv的标定与3d重建模块文档链接,此外网上也有较多的内容对畸变矫正原理进行了讲解,因此本文在此不做详细介绍。

 2、opencv提供的畸变矫正接口

opencv提供了可以直接使用的矫正算法,即通过cv::calibrateCamera 得到内参与畸变系数,然后使用cv::undistort 函数一次性完成图像的畸变矫正;也可以通过initUndistortRectifyMap()和remap()的组合来处理。

1)initUndistortRectifyMap()

void cv::initUndistortRectifyMap	(	InputArray 	cameraMatrix,
                                        InputArray 	distCoeffs,
                                        InputArray 	R,
                                        InputArray 	newCameraMatrix,
                                        Size 	size,
                                        int 	m1type,
                                        OutputArray 	map1,
                                        OutputArray 	map2 
                                    )	
  • cameraMatrix:相机矩阵,包含相机的内部参数(焦距、光心等)。
  • distCoeffs:畸变系数,用于描述相机的畸变情况(径向畸变和切向畸变)。
  • R:校正变换矩阵,用于将输入图像校正为校正后的输出图像。
  • newCameraMatrix:校正后的相机矩阵,可以自定义或者使用校正变换矩阵生成。
  • size:输出图像的尺寸。
  • m1type:输出映射表map1的数据类型。
  • map1map2:输出的映射表,存储输入图像到输出图像的像素坐标映射关系。

作用说明:函数的作用是根据相机的内部参数、畸变系数、校正变换矩阵和输出图像的尺寸等信息,计算出一个映射表,其中包含了每个输入图像像素对应的输出图像位置。通过这个映射表,可以将输入图像中的像素根据校正后的映射关系重构成校正后的输出图像,从而实现相机畸变的校正。

2)remap()

cv::remap是重映射函数,通常用来纠正校准的立体图像。参考:OpenCV图像处理——重映射 remap函数

3)cv::undistort

void cv::undistort	(	InputArray 	src,
                    OutputArray 	dst,
                    InputArray 	cameraMatrix,
                    InputArray 	distCoeffs,
                    InputArray 	newCameraMatrix = noArray() 
                    )	
  • src:输入图像,可以是单通道或多通道的图像。
  • dst:输出图像,校正后的图像将存储在此处。
  • cameraMatrix:相机矩阵,包含相机的内部参数(焦距、光心等)。
  • distCoeffs:畸变系数,用于描述相机的畸变情况(径向畸变和切向畸变)。
  • newCameraMatrix:校正后的相机矩阵,可以自定义或者使用默认值noArray()。如果指定了新的相机矩阵,函数将根据新相机矩阵对图像进行校正;否则,将使用原始相机矩阵进行校正。

作用说明:函数的作用是根据提供的相机参数,对输入图像直接进行相机畸变校正。

4)cv::undistortPoints
 

上面介绍的都是对整张图像进行畸变矫正,这样子实际上是比较慢的,我在项目中实际遇到的也是对几个像素点的畸变矫正,经过查找发现有这个函数。

void cv::undistortPoints	(	InputArray 	src,
                            OutputArray 	dst,
                            InputArray 	cameraMatrix,
                            InputArray 	distCoeffs,
                            InputArray 	R = noArray(),
                            InputArray 	P = noArray() 
                            )	
  • src:输入的像素点坐标,可以是一个N x 11 x N的矩阵,表示N个像素点。
  • dst:输出的校正后的像素点坐标,校正后的像素点将存储在此处,与输入矩阵具有相同的维度和类型。
  • cameraMatrix:相机矩阵,包含相机的内部参数(焦距、光心等)。
  • distCoeffs:畸变系数,用于描述相机的畸变情况(径向畸变和切向畸变)。
  • R:旋转矩阵,可选参数,默认值为noArray()。如果指定了旋转矩阵,函数将根据旋转矩阵对像素点进行校正;否则,将不考虑旋转变换。
  • P:投影矩阵,可选参数,默认值为noArray()。如果指定了投影矩阵,函数将根据投影矩阵对像素点进行校正;否则,将不考虑投影变换。

3、源码学习

先休息了,明天接着写

猜你喜欢

转载自blog.csdn.net/pigbossa/article/details/131118083