【Matlab双目标定与立体匹配】

本文介绍了如何使用Matlab对基于仿真数据的主动散斑双目相机进行标定,并展示了立体匹配过程,包括棋盘格检测、视差计算以及点云重建的步骤。
摘要由CSDN通过智能技术生成

介绍

本文给出了一组主动散斑双目的仿真数据,在此基础上,用Maltab实现了双目相机的标定与立体匹配。数据和代码见Github仓库:https://github.com/zxcn/matlab_stereo_vision

仿真数据

仿真数据由Blender生成,双目模组参数值如下表。

参数WidthHeight f x f_x fx f y f_y fy c x c_x cx c y c_y cy k 1 k_1 k1 k 2 , k 3 p 1 , p 2 k_2,k_3\\p_1,p_2 k2,k3p1,p2Rotation (Euler XYZ)Translation(mm)
左相机16001200718.66718.66799.5599.5-0.0100°,0°,0°0,0,0
右相机16001200718.66718.66799.5599.5-0.0100.5°,0.1°,-0.2°100,0.5,1

这里的主点位置是相对于图像左上角像素坐标为(0,0)的坐标。Matlab图像左上角像素坐标为(1,1),标定结果中主点坐标需减1才能和此处的真值对应。

下图是标定板仿真结果示例,共有九组位姿。
标定板仿真数据

下图是散斑图像仿真结果示例。
Blender双目仿真
散斑仿真数据

双目标定

clear
clc
close all

% 图像后缀
image_suffix = '.png';

% 图像路径
left_image_path = './Data/Left';
right_image_path = './Data/Right';

% 查找路径下所有指定格式的图像
left_image_list = dir([left_image_path,'/*',image_suffix]);
right_image_list = dir([right_image_path,'/*',image_suffix]);

% 结构体转换为元胞数组
imageFileNames1 = cellfun(@(c1,c2)[c1,'/',c2],{left_image_list.folder},{left_image_list.name},'UniformOutput',false);
imageFileNames2 = cellfun(@(c1,c2)[c1,'/',c2],{right_image_list.folder},{right_image_list.name},'UniformOutput',false);

% 棋盘格检测
detector = vision.calibration.stereo.CheckerboardDetector();
[imagePoints, imagesUsed] = detectPatternPoints(detector, imageFileNames1, imageFileNames2);

% 棋盘格角点的世界坐标
% Generate world coordinates for the planar patten keypoints
squareSize = 20;  % 单位mm
worldPoints = generateWorldPoints(detector, 'SquareSize', squareSize);

% 读取左相机的第一个图像,获得图像长宽
I1 = imread(imageFileNames1{1});
[mrows, ncols, ~] = size(I1);

% estimateCameraParameters:相机标定函数
% EstimateSkew:是否计算Skew参数
% EstimateTangentialDistortion:是否计算切向畸变参数p1,p2
% NumRadialDistortionCoefficients:径向畸变参数数量,为2则仅使用k1,k2,为3则使用k1,k2,k3
% WorldUnits:尺度单位
% InitialIntrinsicMatrix:内参矩阵初始值
% InitialRadialDistortion:径向畸变初始值
% ImageSize:图像长宽
[stereoParams, pairsUsed, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints, ...
    'EstimateSkew', false, 'EstimateTangentialDistortion', true, ...
    'NumRadialDistortionCoefficients', 3, 'WorldUnits', 'millimeters', ...
    'InitialIntrinsicMatrix', [], 'InitialRadialDistortion', [], ...
    'ImageSize', [mrows, ncols]);

% 显示重投影误差
% View reprojection errors
h1=figure; showReprojectionErrors(stereoParams);

%可视化标定板和相机位姿
% Visualize pattern locations
h2=figure; showExtrinsics(stereoParams, 'CameraCentric');

% 显示相机标定结果和误差
% Display parameter estimation errors
displayErrors(estimationErrors, stereoParams);

% 保存标定结果
save stereoParams stereoParams

均值重投影误差
标定板和相机姿态
标定结果如下,与仿真参数十分接近。


			Standard Errors of Estimated Stereo Camera Parameters
			-----------------------------------------------------

Camera 1 Intrinsics
-------------------
Focal length (pixels):   [  718.6581 +/- 0.0170      718.6589 +/- 0.0170  ]
Principal point (pixels):[  800.4972 +/- 0.0135      600.5021 +/- 0.0104  ]
Radial distortion:       [   -0.0100 +/- 0.0000       -0.0001 +/- 0.0001        0.0001 +/- 0.0000  ]
Tangential distortion:   [    0.0000 +/- 0.0000       -0.0000 +/- 0.0000  ]

Camera 1 Extrinsics
-------------------
Rotation vectors:
                         [   -0.0000 +/- 0.0000        0.0000 +/- 0.0000       -0.0000 +/- 0.0000  ]
                         [    0.2618 +/- 0.0000        0.0000 +/- 0.0000       -0.0000 +/- 0.0000  ]
                         [   -0.2618 +/- 0.0000        0.0000 +/- 0.0000        0.0000 +/- 0.0000  ]
                         [    0.0000 +/- 0.0000        0.2618 +/- 0.0000        0.0000 +/- 0.0000  ]
                         [   -0.0000 +/- 0.0000       -0.2618 +/- 0.0000        0.0000 +/- 0.0000  ]
                         [    0.2603 +/- 0.0000       -0.2603 +/- 0.0000        0.0343 +/- 0.0000  ]
                         [    0.2603 +/- 0.0000        0.2603 +/- 0.0000       -0.0343 +/- 0.0000  ]
                         [   -0.2603 +/- 0.0000        0.2603 +/- 0.0000        0.0343 +/- 0.0000  ]
                         [   -0.2603 +/- 0.0000       -0.2603 +/- 0.0000       -0.0343 +/- 0.0000  ]

Translation vectors (millimeters):
                         [ -129.9996 +/- 0.0058     -130.0004 +/- 0.0044      300.0032 +/- 0.0076  ]
                         [ -129.9999 +/- 0.0053     -125.5723 +/- 0.0041      266.3559 +/- 0.0071  ]
                         [ -129.9984 +/- 0.0063     -125.5708 +/- 0.0047      333.6443 +/- 0.0079  ]
                         [ -123.8652 +/- 0.0065     -130.0015 +/- 0.0049      346.5868 +/- 0.0080  ]
                         [ -123.8676 +/- 0.0052     -130.0014 +/- 0.0039      253.4183 +/- 0.0069  ]
                         [ -115.1569 +/- 0.0047     -125.5707 +/- 0.0036      220.9121 +/- 0.0064  ]
                         [ -132.5749 +/- 0.0060     -125.5702 +/- 0.0046      314.0887 +/- 0.0074  ]
                         [ -115.1568 +/- 0.0070     -125.5710 +/- 0.0052      379.0872 +/- 0.0082  ]
                         [ -132.5746 +/- 0.0056     -125.5699 +/- 0.0042      285.9146 +/- 0.0072  ]

Camera 2 Intrinsics
-------------------
Focal length (pixels):   [  718.6726 +/- 0.0170      718.6702 +/- 0.0170  ]
Principal point (pixels):[  800.5148 +/- 0.0134      600.5037 +/- 0.0103  ]
Radial distortion:       [   -0.0100 +/- 0.0000       -0.0001 +/- 0.0001        0.0000 +/- 0.0000  ]
Tangential distortion:   [    0.0000 +/- 0.0000        0.0000 +/- 0.0000  ]

Position And Orientation of Camera 2 Relative to Camera 1
---------------------------------------------------------
Rotation of camera 2:         [   -0.0087 +/- 0.0000       -0.0017 +/- 0.0000        0.0035 +/- 0.0000  ]
Translation of camera 2 (millimeters):[  -99.9977 +/- 0.0030       -0.8583 +/- 0.0028       -1.1606 +/- 0.0061  ]

视差、点云计算

clear
clc
close all

% 加载标定参数
load stereoParams.mat

% 待计算图像路径
left_image_path = './Data/Scene/Left/Gray0001.png';
right_image_path = './Data/Scene/Right/Gray0001.png';

% 读取图片
I1 = double(imread(left_image_path));
I2 = double(imread(right_image_path));

% 极线校正
[J1, J2, reprojectionMatrix] = rectifyStereoImages(I1,I2,stereoParams,'OutputView','valid','FillValues',0);
J1 = mat2gray(J1,[0,1023]);
J2 = mat2gray(J2,[0,1023]);
figure,imshowpair(J1,J2),title('极线校正结果')

% disparityBM:BlockMatch计算视差
% DisparityRange:视差范围
% BlockSize:匹配块的大小
disparityMap = disparityBM(J1,J2,"DisparityRange",[0,128],"BlockSize",25);
figure,imshow(disparityMap,[0,128]),title('视差')

% 重建三维点云
xyzPoints = reconstructScene(disparityMap,reprojectionMatrix);

% 点云维度由HxWx3转换为(HxW)x3
xyzPoints = reshape(xyzPoints,[],3);
% 滤除z值大于2000的点
m = xyzPoints(:,3)<2000;
ind = find(m==1);
xyzPoints = xyzPoints(m,:);

% 显示点云
figure,pcshow(xyzPoints);

极线校正结果
视差
点云

  • 25
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Matlab是一种常用的编程语言和环境,用于科学计算和工程应用。双目相机标定是一种用于精确测量和视觉定位的技术。而OpenCV是一个开源的计算机视觉库,提供了许多用于图像处理和计算机视觉的函数和工具。 要进行Matlab双目相机标定,我们可以通过访问OpenCV官网下载OpenCV库和相关教程来获得所需的功能和指导。方法如下: 1. 打开浏览器,输入 “OpenCV官网”并进入OpenCV官网。 2. 在官网主页上,找到下载链接或导航菜单中的“Downloads”(或“下载”)部分。 3. 点击下载链接,进入下载页面。 4. 在下载页面上,找到与您的操作系统和Matlab版本兼容的最新版本的OpenCV库。 5. 单击下载按钮,开始下载OpenCV库。 6. 下载完成后,将OpenCV库文件保存到您选择的目录中。 7. 解压缩下载的文件,将相关文件和文件夹复制到您的Matlab工作目录中。 8. 打开Matlab,创建并打开一个新的脚本文件。 9. 在脚本文件中,编写适当的Matlab代码来使用OpenCV库进行双目相机标定。 10. 运行脚本文件,在Matlab命令窗口或图形用户界面中查看和分析结果。 通过在Matlab中使用OpenCV库,您可以利用双目相机标定来获得相机的内部和外部参数,例如相机矩阵、畸变系数和旋转矩阵。这些参数可以用于立体视觉应用中,如深度估计、立体匹配和三维重建。 在进行双目相机标定之前,建议您先阅读相关的OpenCV教程和Matlab文档,以了解更多关于双目相机标定和OpenCV库的细节和使用方法。这样能够更好地理解和应用这些技术,以获得准确且可靠的结果。 ### 回答2: 对于Matlab双目相机标定,可以通过从OpenCV官网下载相关的库和软件包来实现。OpenCV是一种开源的计算机视觉库,提供了丰富的功能和工具,包括双目相机标定。 首先,打开OpenCV官网(https://opencv.org/)并导航到下载页面。在下载页面上,你可以找到适合你操作系统的最新版本的OpenCV库和软件包。 选择合适的版本后,点击下载按钮,下载文件并保存到本地。 下载完成后,解压缩文件,找到对应的库文件和示例代码来进行Matlab双目相机标定。这个过程可能因为各操作系统的不同而有所差异。 在解压缩的文件中,找到包含示例代码和相关函数的文件夹。在这个文件夹中,你可以找到一个名为“stereo_calibrate”的示例代码或函数,用于双目相机标定。 在Matlab中打开这个示例代码或函数。根据你的需求,可以根据具体要求调整代码或函数的输入参数,如相机矩阵、畸变系数和图像坐标等。 然后,你可以使用这个示例代码或函数来读取双目相机的图像,提取图像特征,计算图像的匹配点对,并进行相机参数的标定。 最后,你可以使用标定后的相机参数来进行三维重建、深度估计或其他相关任务。 总之,通过从OpenCV官网下载相关的库和软件包,可以为Matlab提供双目相机标定的功能,方便实现双目视觉相关应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值