简介本资源是一套面向计算机视觉初学者与工程实践者的MATLAB双目视觉标定与校正完整实现方案聚焦双目相机内外参标定、图像畸变校正、极线对齐、立体匹配预处理等核心环节适用于机器人导航、三维测量及自动驾驶等场景的算法验证与教学实践。压缩包共10个文件4个txt参数数据文件用于存储左右相机标定结果与联合校正参数1个C源码camera_rectify.cpp提供底层图像重映射实现1个Visual Studio解决方案sln及配套vcxproj/filters工程文件支持混合编程调试1个docx说明文档含流程图与参数解释1个md格式README提供使用指引整体仅40KB轻量易部署。已有216人学习下载资源结构清晰、模块解耦明确从标定板角点检测、重投影误差分析到双目几何模型构建与图像去畸变处理覆盖从理论建模到代码落地的全链路关键步骤可直接运行验证标定精度并复用各子模块于自定义双目系统开发。1. 项目概述从“看见”到“测准”的必经之路如果你正在捣鼓双目视觉无论是想做个三维重建、机器人导航还是搞个简单的测距应用那么“标定”和“校正”这两个词绝对是你绕不开的坎。这个项目说白了就是利用MATLAB这个强大的数学工具箱把一对双目相机从“两个独立的眼睛”变成一个“能精准测量世界的立体视觉系统”的全过程。它解决的是让相机“看见”的二维图像能够真实、无扭曲地反映三维世界并建立起左右视图间严格的几何对应关系。想象一下你新买了一副眼镜如果两个镜片的度数、光心位置、甚至镜片本身的畸变都不一样那你看到的世界肯定是重影、扭曲、无法聚焦的。双目相机系统在出厂时其内部的光学镜头、传感器安装位置都存在微小的、不可避免的差异和畸变。这个项目要做的就是给这对“眼睛”做一次全面的“验光”和“配镜”。通过拍摄一组已知图案标定板的图像计算出每只“眼睛”的“度数”内参如焦距、主点、“散光”畸变系数以及两只“眼睛”之间的相对位置和朝向外参。然后基于这些参数对拍摄到的任何图像进行“矫正”消除畸变并让左右图像的极线对齐为后续的立体匹配寻找左右图中的对应点铺平道路。最终我们还能通过重投影误差来评估这次“验光”到底有多准。无论你是计算机视觉的初学者想亲手实现一遍经典流程来加深理解还是项目开发中需要一个可靠、可复现的标定与校正模块这个基于MATLAB的实现都能提供一个清晰、完整的参考框架。MATLAB的计算机视觉工具箱Computer Vision Toolbox和图像处理工具箱Image Processing Toolbox为这一系列操作提供了高度集成的函数让我们可以更专注于算法原理和流程理解而非底层代码的调试。2. 系统核心流程与设计思路拆解一个完整的双目视觉标定与校正系统其核心流程是一个环环相扣的链条。理解这个链条上每个环节的目的和输入输出比直接跳进代码更重要。整个流程可以清晰地分为四个阶段数据准备与角点检测、参数计算与模型构建、图像校正与极线对齐以及最终的精度验证。2.1 流程总览从原始图像到校正视图整个系统的输入是一系列由左右相机同步拍摄的、包含标定板通常是棋盘格的图像对。输出则是校正后的左右图像对以及一整套用于描述相机和系统几何特性的参数。中间过程如下图像采集在多个不同位置和姿态下同步拍摄标定板。通常需要10-20组图像对以确保参数估计的鲁棒性。标定板应尽量充满画面并呈现多种倾斜、旋转状态。角点检测在每一张图像中自动检测标定板棋盘格的角点黑白方格的交点的像素坐标。这是所有后续计算的“数据基石”。单目标定分别利用左相机和右相机各自拍摄的多张图像计算每个相机的内部参数内参和镜头畸变参数。这相当于单独为每只“眼睛”验光。双目标定利用左右相机同步拍摄的、对应同一标定板姿态的图像对计算右相机相对于左相机的旋转矩阵和平移向量外参。这确定了两个“眼睛”之间的相对位置关系。立体校正基于计算得到的内外参数对左右相机图像平面进行重投影使得它们共面且行对齐。这个过程会生成一对校正映射表。图像校正利用上一步生成的映射表对任意新拍摄的图像进行去畸变和极线对齐处理得到可以直接用于立体匹配的校正图像。误差分析通过计算重投影误差来定量评估整个标定过程的精度。误差越小说明标定越准确。这个设计思路的核心在于“分而治之”先解决单个相机的内部问题畸变再解决两个相机之间的外部关系相对位置最后利用所有已知信息将原始的非理想图像对变换成一个理想的、便于计算的立体视觉模型。2.2 为什么选择MATLAB工具选型的深层考量你可能会问OpenCV不是更流行吗确实OpenCV在工业部署和C/Python集成上优势明显。但对于这个项目所侧重的算法学习、快速原型验证和流程理解而言MATLAB具有不可替代的优势高度集成与易用性MATLAB的计算机视觉工具箱将标定、校正、立体匹配等复杂功能封装成了几个直观的函数如detectCheckerboardPoints,estimateCameraParameters,stereoParameters,rectifyStereoImages。你不需要从零开始编写角点检测算法、非线性优化求解器可以快速搭建起完整流程把精力集中在理解“为什么要这么做”以及“参数的意义是什么”上。强大的可视化与调试能力MATLAB在数据可视化方面是顶尖的。你可以轻松地绘制出检测到的角点、畸变校正前后的对比图、极线几何示意图甚至三维显示相机和标定板的位置。这对于理解算法原理和调试问题至关重要。一眼就能看出角点检测是否准确校正后的图像行对齐效果如何。可靠的算法实现MathWorks提供的这些函数经过了充分的测试和优化其背后的算法如张正友标定法实现稳定可靠。对于初学者和研究者这避免了因自己实现算法bug而导致的错误结论。无缝的数学计算环境标定本质上是一个非线性优化问题涉及大量的矩阵运算如SVD、最小二乘。MATLAB的矩阵操作语法极其简洁便于你手动验证中间结果或者实现一些自定义的误差分析。注意如果你最终的目标是将此系统部署到嵌入式设备如Jetson系列或需要与大型C项目集成那么用MATLAB完成原理验证和参数初值计算后再将核心算法移植到OpenCV是更高效的路径。MATLAB Coder工具也可以帮助你将部分算法生成C/C代码。3. 核心细节解析与实操要点理解了宏观流程我们深入到几个最核心也最容易出错的环节看看它们背后的原理和实操中的“坑”。3.1 标定板不只是黑白格子标定板是整个世界坐标系的原点。我们通常使用棋盘格标定板因为其角点定义明确易于检测。在MATLAB中你需要明确告知系统标定板的规格。关键参数checkerboardSize。这不是指图像的像素尺寸而是指棋盘格内部角点的数量。例如一个8x11的棋盘格其内部角点行数为78-1列数为1011-1。checkerboardSize应设置为[7, 10]。这是一个非常常见的错误来源设置错误会导致角点检测失败或后续计算混乱。世界坐标通常将标定板平面定义为Z0的平面棋盘格左上角或第一个检测到的角点设为原点(0,0,0)每个方格的实际物理尺寸如边长25mm决定了世界坐标的单位。这个物理尺寸squareSize是连接像素坐标和真实世界尺寸的桥梁必须精确测量。拍摄技巧覆盖视野让标定板出现在图像的不同区域中心、四角。丰富姿态不仅有正面拍摄还要有倾斜、旋转、远近变化让标定板在图像中呈现透视变形。这能为优化算法提供更多约束特别是对畸变参数的估计至关重要。清晰对焦图像模糊会严重影响角点检测的亚像素精度。均匀光照避免反光和阴影覆盖角点区域。3.2 角点检测一切计算的起点detectCheckerboardPoints函数是这一步的利器。但它不是万能的。过程该函数首先进行二值化提取棋盘格轮廓然后利用几何约束找到角点的初始位置最后进行亚像素级精化得到精度可达子像素的角点坐标。常见问题与排查检测失败可能是棋盘格未被完整拍摄边缘被裁剪、对比度太低、光照不均或有强烈反光。尝试调整图像对比度或使用imadjust进行预处理。有时稍微调整checkerboardSize的猜测值也能奏效。检测错误检测到的角点顺序或数量不对。务必用insertMarker函数将检测到的角点可视化到原图上人工检查每一张图。MATLAB的标定App会自动做这个可视化在脚本中我们需要手动实现。精度不足确保标定板平整拍摄时相机稳定。亚像素精度对轻微的运动模糊都很敏感。% 示例检测角点并可视化 I imread(left01.jpg); [imagePoints, boardSize] detectCheckerboardPoints(I); J insertMarker(I, imagePoints, x, Color, red, Size, 10); imshow(J); title(sprintf(检测到 %d x %d 个角点, boardSize));3.3 相机模型与参数解读理解“内参”和“畸变”这是标定的核心理论部分。相机模型将三维世界点(X, Y, Z)投影到二维图像像素点(u, v)。内参矩阵 (Intrinsic Matrix) 描述了相机自身的几何属性。K [fx, s, cx; 0, fy, cy; 0, 0, 1]fx, fy: x轴和y轴方向的焦距以像素为单位。如果相机传感器像素是正方形理论上fx fy。cx, cy: 主点坐标通常是图像的中心但未必精确是中心是光轴与成像平面的交点。s: 倾斜系数通常为0表示像素是矩形的。为什么需要它它建立了三维点在相机坐标系下到理想无畸变图像坐标的映射。畸变系数 (Distortion Coefficients) 描述了镜头引起的非线性形变主要有径向畸变和切向畸变。径向畸变k1, k2, k3, ...。表现为图像中心向边缘的“桶形”或“枕形”扭曲。通常k1, k2足以建模k3用于广角镜头。切向畸变p1, p2。由于镜头与传感器不平行导致表现为图像好像被“剪切”了。如何校正校正过程就是根据这些系数为原始图像中的每一个像素计算其在无畸变图像中应该对应的位置生成一个映射表查找表然后通过插值得到校正后的图像。这个过程也叫“去畸变”。实操心得对于普通镜头径向畸变占主导尤其是k1。如果你发现校正后的图像边缘物体变得笔直说明畸变校正生效了。切向畸变通常很小。在MATLAB的cameraParameters对象中这些参数以RadialDistortion和TangentialDistortion属性存储。3.4 立体几何与极线约束校正的理论基础双目视觉的核心是利用视差计算深度。但前提是我们需要一个理想的立体配置两个相机的成像平面共面且行对齐。这样一个三维点在左右图像中的投影点必然位于同一行即共线。这条线就是极线。然而实际的双目相机很难物理上做到完全共面行对齐。立体校正的目的就是通过数学变换单应性变换将两个实际相机的图像平面重投影到一对虚拟的、共面且行对齐的相机平面上。旋转矩阵 R 和平移向量 T这是右相机相对于左相机的外参。T的范数就是双目相机的基线距离是计算深度的关键。基线越长同样距离产生的视差越大测距精度潜力越高但视野重叠区域越小。立体校正的本质为左右相机各计算一个旋转矩阵R1和R2使得将它们分别应用到左右相机后新的“虚拟”相机光轴平行成像平面共面。同时为了最大化共同视野还会进行一个仿射变换进行图像裁剪和缩放。校正映射表校正不是对图像像素进行简单的旋转平移而是一个复杂的、非线性的重映射过程。stereoRectify函数或rectifyStereoImages的内部调用会计算出两个映射表map1和map2它们定义了原始畸变图像上的每个像素在最终校正图像上的位置。实际的校正操作remap就是根据这个表进行插值。4. 实操过程与核心环节实现下面我们结合MATLAB代码分步拆解整个实现流程。假设我们已经准备好了20组左右相机同步拍摄的棋盘格图像left_01.jpg~left_20.jpg,right_01.jpg~right_20.jpg棋盘格物理方格边长为25毫米内部角点数为9x6即checkerboardSize [8, 5]因为角点行数格子行数-1。4.1 步骤一数据准备与角点检测首先我们需要批量读取图像并检测角点同时为每个角点赋予其对应的世界坐标。% 1. 初始化参数 imageDir ‘./calibration_images/’; squareSize 25; % 毫米 checkerboardSize [8, 5]; % [行数-1, 列数-1] % 2. 创建世界坐标点标定板平面Z0 worldPoints generateCheckerboardPoints(checkerboardSize, squareSize); % worldPoints 是一个 Nx2 的矩阵每一行是 (X, Y) Z默认为0 % 3. 初始化存储变量 imageFileNames1 {}; % 左图像路径 imageFileNames2 {}; % 右图像路径 imagePoints1 []; % 左图像角点 imagePoints2 []; % 右图像角点 % 4. 遍历所有图像对 numPairs 20; for i 1:numPairs % 构造文件名 leftImgName fullfile(imageDir, sprintf(‘left_%02d.jpg’, i)); rightImgName fullfile(imageDir, sprintf(‘right_%02d.jpg’, i)); % 读取图像 I1 imread(leftImgName); I2 imread(rightImgName); % 检测左图角点 [pts1, boardDetected1] detectCheckerboardPoints(I1); % 检测右图角点 [pts2, boardDetected2] detectCheckerboardPoints(I2); % 只有当左右图都成功检测到角点时才使用该图像对 if boardDetected1 boardDetected2 imageFileNames1{end1} leftImgName; imageFileNames2{end1} rightImgName; imagePoints1 cat(3, imagePoints1, pts1); % 按第三维叠加 imagePoints2 cat(3, imagePoints2, pts2); fprintf(‘图像对 %02d: 角点检测成功。\n’, i); else fprintf(‘图像对 %02d: 角点检测失败已跳过。\n’, i); end end % 检查有效图像对数量 numValidPairs length(imageFileNames1); if numValidPairs 3 % 至少需要3组数据 error(‘有效标定图像对数量不足请检查图像质量或标定板设置。’); else fprintf(‘共找到 %d 组有效图像对。\n’, numValidPairs); end注意generateCheckerboardPoints函数非常方便它直接根据棋盘格尺寸和物理大小生成了对应的世界坐标。detectCheckerboardPoints返回的角点顺序与该函数生成的世界点顺序是自动匹配的这是MATLAB工具箱设计带来的便利。4.2 步骤二单目与双目参数计算有了角点数据和对应的世界坐标就可以进行参数估计了。% 5. 单目标定分别计算左右相机参数 fprintf(‘开始左相机单目标定…\n’); [cameraParams1, ~, estimationErrors1] estimateCameraParameters(imagePoints1, worldPoints, … ‘WorldUnits’, ‘mm’, ‘EstimateSkew’, false, ‘EstimateTangentialDistortion’, true, … ‘NumRadialDistortionCoefficients’, 2, ‘InitialIntrinsicMatrix’, [], … ‘InitialRadialDistortion’, [], ‘ImageSize’, size(I1, [1, 2])); fprintf(‘开始右相机单目标定…\n’); [cameraParams2, ~, estimationErrors2] estimateCameraParameters(imagePoints2, worldPoints, … ‘WorldUnits’, ‘mm’, ‘EstimateSkew’, false, ‘EstimateTangentialDistortion’, true, … ‘NumRadialDistortionCoefficients’, 2, ‘InitialIntrinsicMatrix’, [], … ‘InitialRadialDistortion’, [], ‘ImageSize’, size(I2, [1, 2])); % 6. 双目标定计算立体参数旋转矩阵R和平移向量T fprintf(‘开始双目标定…\n’); [stereoParams, ~, ~] estimateStereoParameters(imagePoints2, imagePoints1, … cameraParams2, cameraParams1, ‘WorldPoints’, worldPoints); % stereoParams 是一个 stereoParameters 对象它包含了 % - cameraParameters1, cameraParameters2: 左右相机参数已优化 % - RotationOfCamera2: 右相机相对于左相机的旋转矩阵 R % - TranslationOfCamera2: 右相机相对于左相机的平移向量 T参数解析‘EstimateSkew’, false通常假设像素是矩形的倾斜系数s为0。‘EstimateTangentialDistortion’, true估计切向畸变系数p1, p2。‘NumRadialDistortionCoefficients’, 2估计径向畸变系数k1, k2。对于畸变严重的镜头可以设为3。‘WorldUnits’, ‘mm’指明世界坐标的单位这里与squareSize一致。在estimateStereoParameters中注意输入顺序是(imagePoints2, imagePoints1, cameraParams2, cameraParams1)这确保了输出的RotationOfCamera2和TranslationOfCamera2描述的是“相机2右相对于相机1左”的变换。4.3 步骤三立体校正与图像校正计算出立体参数后就可以计算校正映射并应用于图像了。% 7. 计算立体校正映射 % 获取图像尺寸左右相机图像尺寸必须相同 imageSize cameraParams1.ImageSize; % 例如 [480, 640] % 计算校正映射表 [T1, T2] rectifyStereoImages(I1, I2, stereoParams, ‘OutputView’, ‘full’); % T1, T2 是 geometricTransform2d 对象包含了校正映射信息。 % ‘OutputView’, ‘full’ 会输出包含所有像素的校正图像可能有黑边。 % 使用 ‘valid’ 可以裁剪掉无信息的黑边得到最大公共视野。 % 8. 应用校正映射到一对示例图像 leftImg imread(imageFileNames1{1}); rightImg imread(imageFileNames2{1}); [leftRect, rightRect] rectifyStereoImages(leftImg, rightImg, stereoParams, ‘OutputView’, ‘full’); % 9. 可视化校正结果 figure(‘Position’, [100, 100, 1200, 500]); subplot(2,2,1); imshow(leftImg); title(‘原始左图’); subplot(2,2,2); imshow(rightImg); title(‘原始右图’); subplot(2,2,3); imshow(leftRect); title(‘校正后左图’); subplot(2,2,4); imshow(rightRect); title(‘校正后右图’); % 10. 绘制极线对齐检查图红青立体图 figure; anaglyph stereoAnaglyph(leftRect, rightRect); imshow(anaglyph); title(‘红青立体图 - 对齐良好则重影少’); % 11. 绘制对应点连线图检查行对齐 % 在左右校正图上手动或自动选取一些特征点检查其纵坐标是否一致。 % 这里演示手动选取几个点例如标定板角点 figure; imshowpair(leftRect, rightRect, ‘montage’); hold on; % 假设我们从左图选取了5个点 ptsLeft [100, 200; 150, 250; 200, 300; 250, 350; 300, 400]; % 在右图相同行纵坐标相同位置画点 for i 1:size(ptsLeft, 1) plot(ptsLeft(i,1), ptsLeft(i,2), ‘ro’, ‘MarkerSize’, 10, ‘LineWidth’, 2); % 在右图对应位置x坐标可能不同y坐标应相同画点 plot(size(leftRect,2) ptsLeft(i,1), ptsLeft(i,2), ‘bo’, ‘MarkerSize’, 10, ‘LineWidth’, 2); % 画一条水平线连接它们如果对齐完美这条线应该是水平的 line([ptsLeft(i,1), size(leftRect,2) ptsLeft(i,1)], [ptsLeft(i,2), ptsLeft(i,2)], ‘Color’, ‘g’, ‘LineWidth’, 1); end hold off; title(‘校正图像对与行对齐检查绿线应为水平’);关键点rectifyStereoImages函数一次性完成了去畸变和极线校正。‘OutputView’参数的选择很重要‘full’保留所有原始像素信息校正后的图像尺寸会变大包含黑色未定义区域。适合观察校正变换的整体效果。‘valid’裁剪掉所有黑边只保留左右图像完全重叠的区域。得到的图像尺寸会变小但后续立体匹配时不需要处理无效区域更高效。4.4 步骤四精度验证与重投影误差分析标定得准不准不能凭感觉需要用数据说话。重投影误差是最直接的量化指标。% 12. 评估标定精度 fprintf(‘\n 标定精度评估 \n’); % 左相机重投影误差 meanErrorLeft mean(sqrt(sum(cameraParams1.ReprojectionErrors .^ 2, 2))); fprintf(‘左相机平均重投影误差: %.4f 像素\n’, meanErrorLeft); % 右相机重投影误差 meanErrorRight mean(sqrt(sum(cameraParams2.ReprojectionErrors .^ 2, 2))); fprintf(‘右相机平均重投影误差: %.4f 像素\n’, meanErrorRight); % 立体标定重投影误差 meanErrorStereo mean(sqrt(sum(stereoParams.ReprojectionErrors .^ 2, 2))); fprintf(‘立体标定平均重投影误差: %.4f 像素\n’, meanErrorStereo); % 13. 可视化重投影误差以左相机为例 figure; showReprojectionErrors(cameraParams1); title(‘左相机重投影误差’); % 14. 可视化相机外参和标定板姿态 figure; showExtrinsics(cameraParams1); title(‘左相机外参相机与标定板的相对位置’); figure; showExtrinsics(stereoParams); title(‘立体相机外参左右相机与标定板的相对位置’); % 15. 参数报告 fprintf(‘\n 关键参数报告 \n’); fprintf(‘左相机内参矩阵 K1:\n’); disp(cameraParams1.IntrinsicMatrix’); % 注意MATLAB存储的是转置形式 fprintf(‘左相机畸变系数 [k1, k2, p1, p2, k3]:\n’); disp([cameraParams1.RadialDistortion, cameraParams1.TangentialDistortion]); fprintf(‘\n右相机相对于左相机的旋转矩阵 R:\n’); disp(stereoParams.RotationOfCamera2); fprintf(‘右相机相对于左相机的平移向量 T (mm):\n’); disp(stereoParams.TranslationOfCamera2’); baseline norm(stereoParams.TranslationOfCamera2); fprintf(‘双目基线距离: %.2f mm\n’, baseline);解读重投影误差这个误差表示的是将计算出的相机参数和标定板姿态代入相机模型重新投影得到的二维点与实际检测到的角点像素坐标之间的欧氏距离以像素为单位。一般来说 0.5像素非常优秀的标定结果。0.5 - 1.0像素良好的结果适用于大多数应用。 1.0像素可能需要检查标定板图像质量、角点检测精度或拍摄姿态是否足够丰富。5. 常见问题与排查技巧实录在实际操作中你几乎一定会遇到各种问题。下面是我踩过坑后总结的一些排查思路和技巧。5.1 角点检测失败或不稳定症状detectCheckerboardPoints频繁返回boardDetected false或检测到的角点数量时对时错。排查检查图像用imshow仔细查看图像。是否有部分棋盘格在画面外是否有强烈反光或阴影覆盖了多个角点图像是否模糊调整参数detectCheckerboardPoints函数本身参数不多但可以尝试对图像进行预处理。例如使用imadjust或histeq增强对比度使用medfilt2进行中值滤波去除噪声。手动指定区域如果背景复杂可以尝试先手动框选ROI出棋盘格区域再进行检测。验证棋盘格尺寸反复确认checkerboardSize参数设置的是内部角点数而不是方格数。这是最常见的错误。尝试不同标定板如果条件允许使用打印质量更高、表面覆亚光膜的标定板。反光是角点检测的头号杀手。5.2 标定误差过大重投影误差 1像素症状计算出的重投影误差均值很高或者可视化图中误差向量很长且方向杂乱。排查数据质量是根本误差大十有八九是输入数据图像有问题。回顾“拍摄技巧”部分确保图像数量足够建议15组以上、姿态多样、清晰度高。剔除异常图像使用showReprojectionErrors图找出哪些图像的误差明显高于其他图像在图上表现为突出的点。将这些图像从标定数据集中移除重新标定。MATLAB的标定App有交互式剔除功能脚本中需要手动记录并删除。检查世界单位确保squareSize的单位毫米与‘WorldUnits’参数一致并且测量准确。畸变模型是否足够对于鱼眼镜头或广角镜头2个径向畸变系数k1, k2可能不足以建模严重的畸变。可以尝试将‘NumRadialDistortionCoefficients’设置为3。同步问题确保左右图像是严格同步拍摄的。如果标定板在两次拍摄间发生了移动会导致左右图角点对应的世界坐标不一致引入巨大误差。使用硬件触发或确保标定板静止。5.3 立体校正后图像对齐效果不佳症状校正后的左右图像在重叠区域明显的特征点如标定板角点纵坐标不一致红青立体图重影严重。排查首先检查单目标定精度如果左右相机各自的标定误差就很大立体校正不可能好。确保左右相机的重投影误差都在可接受范围内。检查外参查看TranslationOfCamera2。如果平移向量的某个分量特别是Ty异常大可能意味着左右相机在垂直方向上有很大的未对齐或者标定数据中存在严重不同步的图像对。理想的立体配置Ty应该非常小接近0。验证图像对对应关系确保imageFileNames1{i}和imageFileNames2{i}确实是严格同步拍摄的一对。文件名索引错位是低级但致命的错误。尝试 ‘valid’ 视图有时‘full’视图下的黑边区域会造成视觉上的错位感。切换到‘valid’视图只观察有效区域的对齐情况。手动选取特征点检查如4.3节代码所示在校正后的图像上手动选取一些高对比度特征点检查其纵坐标差。允许有1-2个像素的微小偏差这是插值计算和噪声导致的。如果偏差是系统性的例如从上到下偏差逐渐增大则标定可能有问题。5.4 保存与加载标定参数标定过程计算量较大我们需要将结果保存下来供后续的图像校正和立体匹配使用。% 保存标定参数 save(‘stereo_calib_params.mat’, ‘stereoParams’, ‘cameraParams1’, ‘cameraParams2’); fprintf(‘标定参数已保存至 stereo_calib_params.mat\n’); % 在另一个脚本中加载和使用 load(‘stereo_calib_params.mat’); % 加载新图像进行校正 newLeft imread(‘new_scene_left.jpg’); newRight imread(‘new_scene_right.jpg’); [leftRectified, rightRectified] rectifyStereoImages(newLeft, newRight, stereoParams);5.5 后续应用立体匹配预处理校正后的图像其极线已与图像行对齐。这意味着左图中的任意一点其在右图中的对应点只可能出现在同一行上。这极大地简化了立体匹配的搜索范围从二维搜索降为一维搜索。你可以直接使用MATLAB的disparity函数如disparitySGM来计算视差图或者将其作为输入用于你自定义的立体匹配算法。% 示例计算视差图需要Computer Vision Toolbox disparityMap disparitySGM(rgb2gray(leftRectified), rgb2gray(rightRectified)); figure; imshow(disparityMap, []); colormap(‘jet’); colorbar; title(‘视差图’);整个项目从图像采集到生成校正映射和视差图形成了一个完整的双目视觉预处理闭环。这个过程虽然步骤繁多但每一步都有其明确的物理意义和数学基础。通过MATLAB的实现你可以清晰地看到数据如何流动参数如何影响结果这对于深入理解双目视觉至关重要。在实际项目中你可能需要根据相机类型如鱼眼相机需改用estimateFisheyeParameters、场景需求来调整这个流程但核心思想是不变的精确建模严格校正。本文还有配套的精品资源点击获取
