MATLAB 双目相机标定
MATLAB 双目相机标定
Write by Champrin on 2022-12-11
GUET Evolution Team Visual Group
Reference article:
双目相机标定——从MATLAB到OpenCV
相机标定——标定图片拍摄规范
相机标定—>标定图片拍摄规范(附棋盘图)
关于相机标定的问题!
本文使用 MATLAB R2022b
进行双目标定。
采用本文的一些标定选项以及结果数据处理,在 C++ OpenCV 4.5.3
及其双目视觉的相关方法,是能够得到预期的结果的。
若是对远距离进行测距,需要将两个相机的距离调整的更大,以获得更高的精度。
标定操作流程
1. 命令行窗口输入 stereoCameraCalibrator
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202212110426129.png)
2. 点击 Add Images
Folder for images from camera 1
选择左相机
所拍摄的标定棋盘图Folder for images from camera 2
选择右相机
所拍摄的标定棋盘图Size of checkerboard square
为每个棋盘格实际长度(mm)- 点击
确定
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202212110430151.png)
3. 等待完成筛选有效标定图
Total stereo pairs processed
为总计标定图数量Added stereo pairs
为有效标定图数量Rejected stereo pairs
为无效标定图数量- 点击
确定
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202212110436411.png)
4. 设置标定参数
OPTIONS
栏中- 选择
2 Coefficients
(图片上忽略,截错图),3 Coefficients
一般用于鱼眼相机 - 勾选
Tangential Distortion
,计算切向畸变 - 不勾选
Skew
,若勾选,标定相机内参结果将出现参数s
,即内参的第一行是[fx, s, u0]
,这将会与我们使用的 OpenCV 进行测距的参数不同
- 选择
INTRINSICS
栏中,选择Compute Intrinsics
- 点击
Calibrate
5. 查看校正效果,筛去误差大的标定图
- 点击
Show Rectified
查看校正后的效果 - 筛去误差大的标定图,鼠标点击选择或者拖拽红线选择,使得重投影误差小于等于
0.1 pixels
(在左下角图例中Overall Mean Error
后的数值)- 忽略图片上的,这是由于我自己手头上没有实物标定板,使用了iPad显示来代替,但由于过曝,黑白像素点会被“吃掉”,误差会很大
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202301220305897.png)
6. 导出标定结果
- 点击
Export Camera Parameters
- 设置结果变量名(默认即可)
Stereo parameters variable
- 点击
确定
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202301220306921.png)
7. 回到工作区查看标定结果
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202301080512138.png)
最终双目相机标定结果,后续使用OpenCV做双目测距所需参数:
假设结果变量名设置为 stereoParams
-
stereoParams.CameraParameters1
K
相机1(左相机)内参矩阵RadialDistortion
相机1径向畸变参数k1,k2,k3
TangentialDistortion
相机1切向畸变参数p1,p2
-
stereoParams.CameraParameters2
K
相机2(右相机)内参矩阵RadialDistortion
相机2径向畸变参数k1,k2,k3
TangentialDistortion
相机2切向畸变参数p1,p2
-
stereoParams.PoseCamera2
R
相机1到相机2的旋转矩阵,也即相机2相对于相机1的旋转矩阵- R2022b版本在OpenCV上使用无需转置
Translation
相机1到相机2的平移矩阵
OpenCV 相机内参矩阵:\(\begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\)
OpenCV 相机畸变向量:\(\begin{pmatrix} k_1 & k_2 & p_1 & p_2 & k_3 \end{pmatrix}\)
由于第 4 步选择了2 Coefficients
,因此k3
填为0.0
附:标定棋盘图拍摄规范
- 在一次标定的整个过程中,不能调节相机的光圈、焦距,要保证在标定中摄像头进光量与焦距的一致,改变需要重新标定
- 把相机图像分成四个象限(如图1所示),应保证拍摄的标定板图像均匀分布在五个位置(四个象限以及正中心)中,且在每个位置进行不同方向的两次倾斜,参考图2;同时,可以固定住标定板,在不同角度拍摄。
- 标定板的成像应大致占摄像头视野的1/4左右
- 标定板成像不能过曝,过曝会导致特征轮廓的提取的偏移
- 拍摄过程中可以对标定板适当的进行补光,调节标定板到镜头的距离,以便于排出清晰的图片
- 标定图片数量通常在15~25张之间,数量太少,标定的参数会不准确
- 标定时用的标定板最好选择x方向与y方向棋盘格不同的,便于标定程序识别标定板方向
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202301080535110.png)
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202301080535196.png)
![](https://gitee.com/champrin/blog-image-by-pic-go/raw/master/images/202301260203170.png)