双目相机标定流程(MATLAB)

一:经典标定方法

1.1OPENCV

1.2ROS

ROS进行双目视觉标定可以得到左右两个相机的相机矩阵畸变系数,如果是单目标定,用ROS会非常方便。

 3.MATLAB标定(双目标定)

MATLAB用来双目标定会非常方便,主要是为了得到两个相机之间的旋转矩阵R和平移矩阵T。

前提是已经已经用两个相机拍摄好多组照片。

二:采用matlab双目标定流程

2.1选择matlab中的双目标定工具箱

 2.2导入图片并设置棋盘格尺寸

导入左右相机拍摄照片的文件夹,同时设置棋盘格子宽度,点击确定以后,matlab会自动剔除一些质量不高的照片。因此拍摄时照片尽量多一些,图片要求和单目标定时一致,数量我自己的话是建议200张会比较好一些,然后没有那么高的标定需求的话,20张应该够了。涉及到X,Y轴(左右,上下),然后还有SIZE(远近),还有翻转。图片拍摄的角度越多,标定也就越精准。

 

2.3设置参数

参数解释

2.3.1Radial Distortion(径向畸变)

2 Coefficients选项的官方含义:
Use fourth degree polynomial to estimate the radial distortion of a lens.
使用四次多项式来估计透镜的径向畸变。

3 Coefficients选项的官方含义:
This setting is recommended only for wide field of view camera.
Use sixth degree polynomial to estimate the radial distortion of a lens.
此设置仅适用于大视场相机。
使用六次多项式来估计透镜的径向畸变。

综上所述:
对于一般的相机选择2 Coefficients选项即可,对于大视场相机则选择3 Coefficients选项。

2.3.2Compute

Compute包含Skew和Tangential Distortion两个选项

2.3.2.1SKew

Assume that X-axis and Y-axis are not perpendicular. This means that the image pixels are not rectangular. Most modern cameras do not exhibit this issue.
假设X轴和Y轴不垂直。这意味着图像像素不是矩形的。大多数现代相机都没有这个问题。
所以,Skew选项一般不需要选择。

2.3.2.2Tangential Distortion
Tangential distortion occurs when the lens’ principal axis is not perpendicular to the camera sensor.
当镜头的主轴与相机传感器不垂直时,会发生切向失真。

 

2.3.3设置单目标定时的参数(可选) 

如果希望将多目标定时的参数设置和含义与单目标定时保持一致,可以使用与单目标定时相同的参数设置和方法。可以输入之前单目标定时得到的内参矩阵(可选),然后点击"Calibrate"按钮进行计算。这样做可以确保在多目标定时中使用一致的参数和方法来进行校准。

  

左下方的直方图为左右图像的标定误差,点击误差较大的直方图,可以直接在左边的图像对中找到对应的图像,右键选择“Remove and Recalibrate”,可以重复上述步骤,直到认为误差满足标定需求为止。

 2.4导出参数

 2.5读取参数

TranslationOfCamera2:相机2相对于相机1的偏移矩阵;

RotationOfCamera2:相机2相对于相机1的旋转矩阵;

CameraParameters1和CameraParameters2为左右摄像头的单独标定参数

2.5.1两个摄像头的平移和旋转参数

平移参数可直接使用;但旋转参数需进行转置才能使用。

2.5.2摄像机内参矩阵

CameraParameters1与CameraParameters2中包含如下文件:

特别注意:IntrinsicMatrix存放的是摄像头的内参,只与摄像机的内部结构有关,需要先转置再使用。 

2.5.3畸变参数

RadialDistortion和TangentialDistortion中存放的是畸变参数, RadialDistortion为径向畸变,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由K1,K2,K3确定。TangentialDistortion为切向畸变,由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数P1,P2确定。

不过在使用时,需要注意参数的排放顺序,即K1K2P1P2K3。切记不可弄错,否则后续的立体匹配会出现很大的偏差。

参考资料:双目视觉标定MATLAB_matlab双目标定-优快云博客

双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,)_rectifystereoimages-优快云博客

matlab相机标定Options选项解析_radial distortion 3 cofficient-优快云博客Matlab2015 双目相机自动标定 (mamicode.com)

### 双目标定操作指南 在MATLAB中进行双目标定是一项关键任务,尤其是在计算机视觉和三维重建领域。以下是详细的双目标定操作指南,帮助您完成从准备到最终验证的全过程。 #### 1. 准备工作 在开始双目标定之前,确保已经安装了必要的工具箱,如Computer Vision Toolbox。如果没有看到相关的标定工具,请检查是否在安装MATLAB时选择了该工具箱。如果没有,可以通过MATLAB的附加功能管理器进行安装[^1]。 #### 2. 标定板的选择与准备 选择合适的标定板是进行相机标定的第一步。常用的标定板包括棋盘格、圆点阵列等。标定板应具有良好的对比度和清晰的特征点,以便于检测。标定板的尺寸和特征点的间距应根据实际应用场景选择[^3]。 #### 3. 数据采集 使用两个相机同时拍摄标定板的不同位置和角度的照片。确保两个相机的拍摄角度和距离保持一致,以减少误差。通常需要拍摄至少10组不同角度的图像,以确保标定的准确性。 #### 4. 图像预处理 在进行标定之前,对采集到的图像进行预处理是非常重要的。这包括图像去噪、增强对比度等步骤,以提高特征点检测的准确性。 #### 5. 特征点检测 利用MATLAB中的图像处理工具箱,检测每个图像中的特征点。对于棋盘格标定板,可以使用`detectCheckerboardPoints`函数来检测角点。 #### 6. 参数计算 使用检测到的特征点,调用MATLAB中的标定函数进行参数计算。对于双目标定,可以使用`stereoCalibrate`函数,该函数需要输入两个相机的内参、外参以及标定板的三维坐标。 #### 7. 参数优化 标定完成后,使用优化函数对计算得到的参数进行优化,以进一步提高标定的精度。MATLAB提供了多种优化算法,如Levenberg-Marquardt算法,可以通过`estimateCameraParameters`函数实现[^2]。 #### 8. 标定结果验证 验证标定结果是确保标定质量的重要步骤。可以通过重投影误差来评估标定的准确性。重投影误差越小,说明标定结果越准确。MATLAB中的`reprojectPoints`函数可以帮助计算重投影误差。 #### 9. 应用标定结果 标定完成后,可以将标定结果应用于实际场景中,如三维重建、立体匹配等。标定结果包括两个相机的内参矩阵、畸变系数以及外参矩阵。 ### 示例代码 以下是一个简单的MATLAB代码示例,展示了如何进行双目标定: ```matlab % 加载标定图像 leftImages = imageDatastore('path/to/left/images'); rightImages = imageDatastore('path/to/right/images'); % 检测标定板角点 [pointsInLeft, boardSize] = detectCheckerboardPoints(leftImages.Files); [pointsInRight, ~] = detectCheckerboardPoints(rightImages.Files); % 生成标定板的世界坐标 squareSize = 1; % 标定板方格的实际大小 worldPoints = generateCheckerboardPoints(boardSize, squareSize); % 标定双目相机 cameraParams = stereoCalibrate(worldPoints, pointsInLeft, pointsInRight, ... 'ImageSize', [width, height]); % 优化参数 optimizedParams = estimateCameraParameters(worldPoints, pointsInLeft, pointsInRight, ... 'InitialIntrinsicMatrix', cameraParams.IntrinsicMatrix, ... 'InitialDistortionCoefficients', cameraParams.DistortionCoefficients); % 计算重投影误差 reprojectionErrors = calculateReprojectionErrors(optimizedParams, worldPoints, pointsInLeft, pointsInRight); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylsalt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值