逐个函数功能详细讲解ORB_SLAM2源码|cv::initUndistortRectifyMap、cv::remap图像去畸变
/**
* 1. 加载 Euroc 数据集 QQ 952233821 WX slamshizhanjiaocheng
* 2. 加载 Euroc 数据集参数 对图像进行去畸变
*/
// Read rectification parameters 加载相机参数文件对图像进行去畸变
// https://chunqiushenye.blog.csdn.net/article/details/108703089
cv::FileStorage fsSettings("./EuRoC.yaml", cv::FileStorage::READ);
// 图片畸变矫正的映射矩阵mapx、mapy
//第一个参数cameraMatrix为相机内参矩阵
//第二个参数distCoeffs为相机畸变矩阵
//第三个参数R是第一和第二相机坐标之间的旋转矩阵
//第四个参数newCameraMatrix为校正后的 新的相机内参矩阵
//第五个参数size为图像尺寸
//第六个参数定义map1的数据类型,可以是CV_32FC1或者CV_16SC2
//第七个参数map1和第八个参数map2,map1存储去畸变像素的横坐标 map2存储去畸变像素的纵坐标
// https://blog.csdn.net/qq_21950671/article/details/114333314
cv::Mat M1l,M2l,M1r,M2r;
cv::initUndistortRectifyMap(K_l,D_l,R_l,P_l.rowRange(0,3).colRange(0,3),cv::Size(cols_l,rows_l),CV_32F,M1l,M2l);
cv::initUndistortRectifyMap(K_r,D_r,R_r,P_r.rowRange(0,3).colRange(0,3),cv::Size(cols_r,rows_r),CV_32F,M1r,M2r);
//[双线性插值算法的详细总结](https://blog.csdn.net/xjz18298268521/article/details/51220576)
//上面是通过原图像和畸变图像求出两者的映射矩阵,下面就是用这个映射关系去处理每一个畸变的图像,存在亚像素没有值的情况所以需要用到插值算法。
// 重映射原理:通过移动像素修改图像的外观,这个过程不会修改像素值,而是把每个像素的位置重新映射到新的位置。
// 第一个参数src畸变图像
// 第二个参数dst矫正后的图像
// 第三个参数map1和第四个参数map2,X坐标和Y坐标的映射
// 第五个参数interpolation图像的插值方式
// 第六个参数borderMode边界填充方式
cv::remap(imLeft,imLeftRect,M1l,M2l,cv::INTER_LINEAR);
cv::remap(imRight,imRightRect,M1r,M2r,cv::INTER_LINEAR);
函数原型
CV_EXPORTS_W void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs, InputArray R, InputArray newCameraMatrix,Size size, int m1type, OutputArray map1, OutputArray map2 );
在双目相机的例子中,这个函数调用两次:一次是为了每个相机的朝向,经过stereoRectify
之后,依次调用cv::stereoCalibrate
。但是如果这个双目相机没有标定,依然可以使用cv::stereoRectifyUncalibrated
直接从单应性矩阵H中计算修正变换。对每个相机,函数计算像素域中的单应性矩阵H作为修正变换,而不是3D空间中的旋转矩阵R。R可以通过H矩阵计算得来。
# Camera Parameters.Camera calibration and distortion parameters (OpenCV)
# 相机内参数
Camera.fx: 435.2046959714599
Camera.fy: 435.2046959714599
Camera.cx: 367.4517211914062
Camera.cy: 252.2008514404297
# 相机畸变系数
Camera.k1: 0.0
Camera.k2: 0.0
Camera.p1: 0.0
Camera.p2: 0.0
图像宽高
Camera.width: 752
Camera.height: 480
# Camera frames per second 帧率
Camera.fps: 20.0
# stereo baseline times fx 基线
Camera.bf: 47.90639384423901
# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1
# Close/Far threshold. Baseline times.
ThDepth: 35
下面的参数用来对图像在输入跟踪算法之前进行去畸变。
# Stereo Rectification. Only if you need to pre-rectify the images.
# Camera.fx, .fy, etc must be the same as in LEFT.P
LEFT.height: 480 高
LEFT.width: 752 宽
LEFT.D: !!opencv-matrix 畸变系数矩阵
rows: 1
cols: 5
dt: d
data:[-0.28340811(k1), 0.07395907(k2), 0.00019359(k3), 1.76187114e-05(p1), 0.0(p2)]
LEFT.K: !!opencv-matrix 内参矩阵
rows: 3
cols: 3
dt: d
data: [458.654(fx), 0.0, 367.215(cx), 0.0, 457.296(fy), 248.375(cy), 0.0, 0.0, 1.0]
LEFT.R: !!opencv-matrix 旋转矩阵 对于双目左目一般为单位矩阵
rows: 3
cols: 3
dt: d
data: [0.999966347530033, -0.001422739138722922, 0.008079580483432283, 0.001365741834644127, 0.9999741760894847, 0.007055629199258132, -0.008089410156878961, -0.007044357138835809, 0.9999424675829176]
LEFT.P: !!opencv-matrix 投影矩阵 实现空间坐标和像素坐标的转换
rows: 3
cols: 4
dt: d
data: [435.2046959714599(fx), 0, 367.4517211914062(cx), 0, 0, 435.2046959714599(fy), 252.2008514404297(cy), 0, 0, 0, 1, 0]
RIGHT.height: 480
RIGHT.width: 752
RIGHT.D: !!opencv-matrix
rows: 1
cols: 5
dt: d
data:[-0.28368365(k1), 0.07451284(k2), -0.00010473(k3), -3.555907e-05(p1), 0.0(p2)]
RIGHT.K: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [457.587(fx), 0.0, 379.999(cy), 0.0, 456.134(fy), 255.238(cy), 0.0, 0.0, 1]
RIGHT.R: !!opencv-matrix 旋转矩阵
rows: 3
cols: 3
dt: d
data: [0.9999633526194376, -0.003625811871560086, 0.007755443660172947, 0.003680398547259526, 0.9999684752771629, -0.007035845251224894, -0.007729688520722713, 0.007064130529506649, 0.999945173484644]
RIGHT.P: !!opencv-matrix 投影矩阵
rows: 3
cols: 4
dt: d
data: [435.2046959714599(fx), 0, 367.4517211914062(cx), -47.90639384423901(baseline), 0, 435.2046959714599(fy), 252.2008514404297(cy), 0, 0, 0, 1, 0]
# ORB Parameters
# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1200
# ORB Extractor: Scale factor between levels in the scale pyramid
ORBextractor.scaleFactor: 1.2
# ORB Extractor: Number of levels in the scale pyramid
ORBextractor.nLevels: 8
# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7
# Viewer Parameters
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize:2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500
上面参数有一个生成投影矩阵和更新相机内参数的过程,这个过程需要对图像进行去畸变,所以要用到畸变系数。
LEFT.D、LEFT.K、LEFT.R是Opencv标定出来的内外参数,LEFT.P是左相机和右相机生成的虚拟相机的参数,包含旋转和平移(baseline),更新的是fx、fy、cx、xy。后面使用的时候直接使用P矩阵相当于没有畸变,所以Camera.k1、Camera.k2、Camera.p1、Camera.p2参数值是零。
https://blog.csdn.net/qq_21950671/article/details/90449301
针孔鱼眼相机camera和惯导IMU标定方法汇总以及详细标定过程