搜索关键字搜索到网站,按照商业模式,神农架网站设计,wordpress免费资源SLAM算法与工程实践系列文章
下面是SLAM算法与工程实践系列文章的总链接#xff0c;本人发表这个系列的文章链接均收录于此
SLAM算法与工程实践系列文章链接 下面是专栏地址#xff1a;
SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…SLAM算法与工程实践系列文章
下面是SLAM算法与工程实践系列文章的总链接本人发表这个系列的文章链接均收录于此
SLAM算法与工程实践系列文章链接 下面是专栏地址
SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践系列文章链接SLAM算法与工程实践系列专栏 前言SLAM算法与工程实践——相机篇传统相机使用2相机标定图像缩放和裁剪后后参数变化缩放resize后参数裁剪crop后参数 立体校正initUndistortRectifyMap()和remap()组合undistort()undistortPoints()组合比较 前言
这个系列的文章是分享SLAM相关技术算法的学习和工程实践 SLAM算法与工程实践——相机篇传统相机使用2
相机标定
参考
opencv 标定与畸变矫正
利用MatLabOpenCV进行相机畸变矫正
要matlab标定数据做双目相机矫正OpenCV C
Matlab 双目相机标定 opencv应用
【OpenCV】摄像机标定畸变校正
标定的方式一般来说是通过拍摄多张标定板的图片标定板上有一些特殊的图案可以让计算机自动查找到这些图案的位置根据这些位置可以计算出外参和内参这是一个畸变和投影方程组求解过程根据相机镜头方程不一样至少4-8组标记位可以得到唯一解。
打开Matlab控制台输入
% 单目相机
cameraCalibrator % 双目相机
stereoCameraCalibrator选择左右视图的文件夹导入图片我这个标定板一小格为 30 mm 其中一组的左图被遮挡了不能用 双目标定界面 畸变参数总共有五个径向畸变3个 k 1 , k 2 , k 3 k_1,k_2,k_3 k1,k2,k3和切向畸变2个( p 1 , p 2 p_1,p_2 p1,p2)。
径向畸变 x c o r r e c t e d x ( 1 k 1 r 2 k 2 r 4 k 3 r 6 ) y c o r r e c t e d y ( 1 k 1 r 2 k 2 r 4 k 3 r 6 ) \begin{array}{l}{{x_{\mathrm{corrected}}x(1k_{1}r^{2}k_{2}r^{4}k_{3}r^{6})}}\\{{y_{\mathrm{corrected}}y(1k_{1}r^{2}k_{2}r^{4}k_{3}r^{6})}}\end{array} xcorrectedx(1k1r2k2r4k3r6)ycorrectedy(1k1r2k2r4k3r6) 切向畸变 x c o r r e c t e d x [ 2 p 1 x y p 2 ( r 2 2 x 2 ) ] y c o r r e c t e d y [ p 1 ( r 2 2 y 2 ) 2 p 2 x y ] \begin{aligned}x_{\mathrm{corrected}}x[2p_{1}xyp_{2}(r^{2}2x^{2})]\\y_{\mathrm{corrected}}y[p_{1}(r^{2}2y^{2})2p_{2}xy]\end{aligned} xcorrectedycorrectedx[2p1xyp2(r22x2)]y[p1(r22y2)2p2xy] 以及在OpenCV中的畸变系数的排列这点一定要注意 k 1 k 2 p 1 p 2 k 3 k_1k_2p_1p_2k_3 k1k2p1p2k3千万不要以为 k k k 是连着的。 D i s t o r t i o n c o e f f i c i e n t s ( k 1 k 2 p 1 p 2 k 3 ) \mathrm{Distortion}_{\mathrm{coefficients}}(\mathrm{k_{1}}\quad\mathrm{k_{2}}\quad\mathrm{p_{1}}\quad\mathrm{p_{2}}\quad\mathrm{k_{3}}) Distortioncoefficients(k1k2p1p2k3)
选择畸变参数calibrate
并且通过实验表明三个参数的时候由于 k 3 k_3 k3 所对应的非线性较为剧烈。估计的不好容易产生极大的扭曲所以我们在 MATLAB 中选择使用两参数并且选择错切和桶形畸变。 拖拉红线删除误差大的图像对使投影误差小于0.1像素最好。然后导出标定参数。 我这里标定的误差在0.4精度要求高时不能用 重新拍摄误差为0.08 精度要求不高的情况下0.13的误差也可以接受 可以显示校正后的图像 注意
在Matlab中选择畸变参数时有时需要选3参数的有时需要选2参数的例如我这里选3参数的图像校正后边缘变形了 选择2参数校正后就是正常图像 如果选择两参数的模型那么 k 3 k_3 k3 的值直接设为0
导出相机参数 误差 相机参数如下所示 相机外参 上图中的 RotationOfCamera2 和 TranslationOfCamera2 是右相机相对于左的旋转平移矩阵即R和T
校正畸变后的图像
相机内参 注意其中畸变系数向量在opencv中的顺序为 k1 k2 d1 d2 k3
opencv中内参的格式为 [ f x 0 c x 0 f y c y 0 0 1 ] \left[\begin{matrix} f_x0c_x\\ 0f_yc_y\\ 001 \end{matrix}\right] fx000fy0cxcy1
填入opencv前的中间处理 相机内参和旋转矩阵需要转置后填入 k1,k2,p1,p2,,k3 按照顺序填入畸变系数矩阵 distCoeff 平移矩阵直接填入
然后将参数写入配置文件中方便下次读取
图像缩放和裁剪后后参数变化
参考
图像缩放后相机内参如何变化的
图像Crop和Resize对于相机内参的影响
缩小或放大图像对应的相机内参如何变化
图像缩放对相机内外参矩阵的影响
缩放Resize与裁剪(Center、Random)Crop对相机内参IntrinsicMatrix的影响
缩放resize后参数
内参中的 f x , f y , c x , c y f_x,f_y,c_x,c_y fx,fy,cx,cy 都会相应的变化
如果图像缩小为原来的一半那么 f x , f y , c x , c y f_x,f_y,c_x,c_y fx,fy,cx,cy 都会缩小一半
外参的 R R R 和 T T T 都不会变化
裁剪crop后参数
裁剪后 c x , c y c_x,c_y cx,cy 会相应的变小 而 f x , f y f_x,f_y fx,fy 不变
立体校正
参考
【双目视觉】基于opencv双目校正以及双目测距
OpenCV 不同畸变校正函数的使用说明
立体校正的函数说明如下
void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1,InputArray cameraMatrix2,InputArray distCoeffs2, Size imageSize,InputArray R, InputArray T,OutputArray R1, OutputArray R2, OutputArray P1,OutputArray P2, OutputArray Q, int flagsCALIB_ZERO_DISPARITY, double alpha-1,Size newImageSizeSize(), Rect* validPixROI10, Rect* validPixROI20 )/* cameraMatrix1-第一个摄像机的摄像机矩阵即左相机相机内参矩阵矩阵第三行格式应该为 0 0 1distCoeffs1-第一个摄像机的畸变向量cameraMatrix2-第一个摄像机的摄像机矩阵即右相机相机内参矩阵矩阵第三行格式应该为 0 0 1distCoeffs2-第二个摄像机的畸变向量imageSize-图像大小R- 相机之间的旋转矩阵这里R的意义是相机1通过变换R到达相机2的位姿T- 左相机到右相机的平移矩阵R1-输出矩阵第一个摄像机的校正变换矩阵旋转变换R2-输出矩阵第二个摄像机的校正变换矩阵旋转矩阵P1-输出矩阵第一个摄像机在新坐标系下的投影矩阵P2-输出矩阵第二个摄像机在想坐标系下的投影矩阵Q-4*4的深度差异映射矩阵flags-可选的标志有两种零或者CV_CALIB_ZERO_DISPARITY ,如果设置 CV_CALIB_ZERO_DISPARITY 的话
该函数会让两幅校正后的图像的主点有相同的像素坐标。否则该函数会水平或垂直的移动图像以使得其有用的范围最大alpha-拉伸参数。如果设置为负或忽略将不进行拉伸。如果设置为0那么校正后图像只有有效的部分会被显示没有黑色的部分
如果设置为1那么就会显示整个图像。设置为0-1之间的某个值其效果也居于两者之间。newImageSize-校正后的图像分辨率默认为原分辨率大小。validPixROI1-可选的输出参数Rect型数据。其内部的所有像素都有效validPixROI2-可选的输出参数Rect型数据。其内部的所有像素都有效initUndistortRectifyMap()和remap()组合
通过映射的方式逐个找出理想点在有畸变原图的位置。initUndistortRectifyMap()用于产生映射表remap()用于执行映射。
适用场景
当要进行多次畸变校正时使用initUndistortRectifyMap() remap()组合比较有效率只需要执行一次initUndistortRectifyMap()后面畸变校正只需要执行remap()即可
用法如下 //计算校正映射矩阵Mat map11, map12, map21, map22;initUndistortRectifyMap(cameraMatrixL, distCoeffsL, R1, P1, imageSize, CV_16SC2, map11, map12);initUndistortRectifyMap(cameraMatrixR, distCoeffsR, R2, P2, imageSize, CV_16SC2, map21, map22);for (int i 0; i imgLs.size(); i){//进行校正映射Mat img1r, img2r;imgLs[i];remap(imgLs[i], img1r, map11, map12, INTER_LINEAR);remap(imgRs[i], img2r, map21, map22, INTER_LINEAR);imwrite(./imgdata/imgleftRec to_string(i) .png, img1r);imwrite(./imgdata/imgrightRec to_string(i) .png, img2r);//拼接图像Mat result;hconcat(img1r, img2r, result);imshow(校正后结果 to_string(i), result);}undistort()
本质是initUndistortRectifyMap() remap()组合写在了一个函数里。方便只校正一次。
适用场景 当只需要执行一次畸变校正时用undistort()比用组合形式更方便一些。
undistortPoints()
适用场景 当只需要找出有畸变原图中的少数几个点经过畸变校正后的理想位置时使用undistortPoints()可达到目的。
组合比较
initUndistortRectifyMap() remap()组合和undistort()结果是一模一样的
initUndistortRectifyMap() remap()组合和undistortPoints()对特征点的校正结果大体一致在亚像素级别有略微差别