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 三个轴上的误差)。
相关推荐
A__tao11 分钟前
告别手写 Go 结构体!推荐一个支持注释解析的 YAML 转 Struct 在线工具
开发语言·后端·golang
何以解忧,唯有..13 分钟前
Go 语言语句分隔符详解:分号、换行与代码规范
开发语言·golang·代码规范
人邮异步社区17 分钟前
C语言进阶的书籍推荐
c语言·开发语言
凡人叶枫24 分钟前
Effective C++ 条款33:避免遮掩继承而来的名字
linux·服务器·开发语言·c++·嵌入式开发
10岁的博客24 分钟前
NOIP2010普及组「接水问题」详解:模拟算法与优先队列解法
开发语言·c++·算法
凡人叶枫25 分钟前
Effective C++ 条款31:将文件间的编译依存关系降至最低
linux·开发语言·c++·php·嵌入式开发·effective c++
heimeiyingwang35 分钟前
【架构实战】数据脱敏与隐私保护:合规是底线
java·开发语言·架构
于指尖飞舞1 小时前
java后端面试题(常用集合极简)
java·开发语言·面试
稷下元歌1 小时前
python核心基础,这关于基于Moveltg加 Ros2实战Python编程基础实课
开发语言·python
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第114题】【并发篇】第14题:说一下悲观锁的优点和缺点?
java·开发语言·面试