Matlab2025a实现双目相机标定~业余版

目录

1.环境准备

2.流程

[2.1 使用双目相机对准标定板拍大概20张高质量图片(距离角度尽量丰富些)](#2.1 使用双目相机对准标定板拍大概20张高质量图片(距离角度尽量丰富些))

[2.2 分割成左图和右图](#2.2 分割成左图和右图)

[2.3 使用matlab中APP下的Stereo Camera Calibrator,导入图片](#2.3 使用matlab中APP下的Stereo Camera Calibrator,导入图片)

[2.4 导出所有参数](#2.4 导出所有参数)

[2.5 标定参数解释](#2.5 标定参数解释)


1.环境准备

matlab软件、棋盘格标定板、双目相机、笔记本电脑

2.流程

2.1 使用双目相机对准标定板拍大概20张高质量图片(距离角度尽量丰富些)

原理参考链接:OpenCV:使用 OpenCV 进行相机校准

OpenCV:创建校准模式

棋盘格打印:opencv/doc/pattern.png 在 4.x 上 ·opencv/opencv

我的标定板比较业余,整体不是特别平的话会导致误差比较大。

2.2 分割成左图和右图

matlab代码:

Matlab 复制代码
% 设置图像文件夹路径
inputFolder = 'C:\Users\mqli0\Pictures\Camera Roll';  % 输入你存放双目图像的文件夹路径
outputFolderLeft = 'C:\Users\mqli0\Pictures\tem\left';  % 保存左图像的文件夹路径
outputFolderRight = 'C:\Users\mqli0\Pictures\tem\right';  % 保存右图像的文件夹路径

% 创建输出文件夹(如果文件夹不存在的话)
if ~exist(outputFolderLeft, 'dir')
    mkdir(outputFolderLeft);
end
if ~exist(outputFolderRight, 'dir')
    mkdir(outputFolderRight);
end

% 使用 imageDatastore 读取文件夹中的所有图像
imageFiles = imageDatastore(inputFolder, 'FileExtensions', {'.jpg', '.png', '.bmp'});

% 循环遍历每一张图像
for i = 1:numel(imageFiles.Files)
    % 读取当前图像
    stereoImage = imread(imageFiles.Files{i});
    
    % 获取图像的尺寸
    [imageHeight, imageWidth, numChannels] = size(stereoImage);
    
    % 假设左右图像宽度相同
    halfWidth = imageWidth / 2;
    
    % 分割左图和右图
    leftImage = stereoImage(:, 1:halfWidth, :);  % 左图是前半部分
    rightImage = stereoImage(:, halfWidth+1:end, :);  % 右图是后半部分
    
    % 生成文件名并保存左图和右图
    [~, name, ext] = fileparts(imageFiles.Files{i});  % 获取文件名和扩展名
    leftImageFile = fullfile(outputFolderLeft, [name, '_left', ext]);
    rightImageFile = fullfile(outputFolderRight, [name, '_right', ext]);
    
    % 保存分割后的左右图像
    imwrite(leftImage, leftImageFile);
    imwrite(rightImage, rightImageFile);
    
    fprintf('保存了 %s 和 %s\n', leftImageFile, rightImageFile);  % 输出处理信息
end

disp('所有图像已处理完毕!');
2.3 使用matlab中APP下的Stereo Camera Calibrator,导入图片

点开始标定,

2.4 导出所有参数
2.5 标定参数解释
参数 描述 说明
CameraParameters1 第一台相机的内参 包含相机1的焦距、主点、畸变系数等内参。
CameraParameters2 第二台相机的内参 包含相机2的焦距、主点、畸变系数等内参。
PoseCamera2 第二台相机相对于第一台相机的 位置和姿态(外参) 包含旋转矩阵和位移向量,描述相机2相对于相机1的位置和朝向。
FundamentalMatrix 基础矩阵 3x3 矩阵,描述两个相机之间的几何关系。用于图像匹配和重建。
EssentialMatrix 本质矩阵 3x3 矩阵,描述两个相机的相对姿态(旋转和平移)。需要知道相机内参。
MeanReprojectionError 平均重投影误差 衡量标定精度的指标,表示实际测量点与计算点之间的平均误差,单位是像素。
NumPatterns 用于标定的标定图案数量 例如 21 表示使用了 21 个标定图案(棋盘格图案)。
WorldPoints 标定图案在世界坐标系中的点的位置 例如棋盘格的角点在世界坐标系中的实际坐标,单位通常为毫米。
WorldUnits 世界坐标系单位 标定时使用的单位,通常是 "millimeters"(毫米)。
参数 描述 说明
Camera1IntrinsicsErrors 第一台相机的内参估计误差 包含相机1的内参(焦距、主点、畸变系数等)的估计误差。
Camera1ExtrinsicsErrors 第一台相机的外参估计误差 包含相机1的旋转矩阵和位移向量的估计误差。
Camera2IntrinsicsErrors 第二台相机的内参估计误差 包含相机2的内参(焦距、主点、畸变系数等)的估计误差。
RotationOfCamera2Error 第二台相机旋转矩阵的估计误差 表示第二台相机的旋转估计误差,单位是弧度。
TranslationOfCamera2Error 第二台相机位移向量的估计误差 表示第二台相机的位移估计误差,单位是毫米(X, Y, Z 三个轴上的误差)。
相关推荐
Brianna Home2 小时前
现代C++:从性能泥潭到AI基石
开发语言·c++·算法
2301_796512522 小时前
Rust编程学习 - 自动解引用的用处,如何进行“解引用”(Deref) 是“取引用”(Ref) 的反操作
开发语言·学习·rust
qq19257230272 小时前
c++特性
开发语言·c++·算法
weixin_307779132 小时前
AWS Elastic Beanstalk 实现 Java 应用高可用部署指南
java·开发语言·云计算·aws·web app
nvd113 小时前
asyncio.run() vs asyncio.gather():启动器与聚合器, 为何Jupyter notebook里能直接使用await?
开发语言·python·jupyter
文人sec3 小时前
使用python-pandas-openpyxl编写运营查询小工具
开发语言·python·pandas
这儿有一堆花3 小时前
C语言递归宏详解
c语言·开发语言·c++
csbysj20203 小时前
C 标准库 - `<ctype.h>`
开发语言
郝学胜-神的一滴3 小时前
计算机图形中的法线矩阵:深入理解与应用
开发语言·程序人生·线性代数·算法·机器学习·矩阵·个人开发