双目视觉使用MATLAB R2018b通过内参矩阵求取外参矩阵
时间: 2023-07-20 18:03:30 浏览: 196
在 MATLAB R2018b 中,可以使用 `cameraParameters` 和 `extrinsics` 函数来求取外参矩阵。具体步骤如下:
1. 读入图片并提取角点
首先,需要读入双目相机拍摄的一对图片,并从中提取出对应的角点。可以使用 `detectCheckerboardPoints` 函数来自动检测棋盘格角点,也可以手动标注角点位置。
2. 定义内参矩阵
接下来,需要定义双目相机的内参矩阵。可以使用 `cameraMatrix` 函数构造一个 `cameraParameters` 对象,该对象包含相机的内参矩阵、畸变系数等信息。
```matlab
intrinsics_left = cameraMatrix([fx_left, 0, cx_left; 0, fy_left, cy_left; 0, 0, 1], size(img_left));
intrinsics_right = cameraMatrix([fx_right, 0, cx_right; 0, fy_right, cy_right; 0, 0, 1], size(img_right));
```
3. 求取外参矩阵
接下来,可以使用 `estimateCameraParameters` 函数来求取双目相机的外参矩阵。该函数需要输入左右相机的内参矩阵、角点坐标等信息。
```matlab
[stereoParams, pairsUsed, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints, ...
'EstimateSkew', false, 'EstimateTangentialDistortion', false, ...
'NumRadialDistortionCoefficients', 2, 'WorldUnits', 'mm', ...
'InitialIntrinsicMatrix', [intrinsics_left.IntrinsicMatrix; zeros(1,3)], ...
'InitialRadialDistortion', [intrinsics_left.RadialDistortion; 0], ...
'Verbose', true);
```
其中,`imagePoints` 是一个包含左右相机角点坐标的 cell 数组,`worldPoints` 是一个包含棋盘格上角点对应的实际物理坐标的矩阵。
4. 获取外参矩阵
最后,可以使用 `extrinsics` 函数从 `stereoParams` 对象中获取左右相机的外参矩阵。
```matlab
[R, t] = extrinsics(imagePoints{1}, worldPoints, stereoParams.CameraParameters1);
```
其中,`imagePoints{1}` 表示左相机的角点坐标,`stereoParams.CameraParameters1` 表示左相机的 `cameraParameters` 对象。`R` 和 `t` 分别表示左相机到世界坐标系的旋转矩阵和平移向量。
注意,上述代码只给出了求取左相机的外参矩阵的示例,求取右相机的外参矩阵的方式类似,只需要将 `imagePoints{1}` 和 `stereoParams.CameraParameters1` 替换为 `imagePoints{2}` 和 `stereoParams.CameraParameters2` 即可。
阅读全文