Advertisement

立体视觉(一)立体标定

阅读量:

`markdown
独立任务:相机标定与立体校准
任务说明
相机标定
目标:通过使用 Camera Calibrator 工具对单个摄像头进行内外参数标定。
步骤:

  • 打开 Camera Calibrator 应用程序。
  • 选择要处理的目标文件夹(如 12 * 10 的黑白条纹棋盘格)。
  • 设置初始内参值(如焦距、缩放因子、主点坐标)。
  • 自动提取角点并初始化角点范围。
  • 调整角点检测器选项并校定内参。
    结果:输出单个摄像头的内外参数矩阵,并将结果保存为 matlabdataleft.mat 和 matlabdataright.mat 文件。
    双目立体校准
    目标:通过使用 stereo_gui 工具对左右两个摄像头进行立体校准。
    步骤:
  • 在 Matlab 中新建文件夹 left-right 并将之前得到的左右摄像头标定结果放入该目录下。
  • 在 stereo_gui 界面中加载左、右摄像头的内参数据并优化外参。
    结果:输出双目系统的内外参数据,并将优化后的外参保存为 CalibResultsstereo.mat 文件。
    三维重建
    目标:通过调用 triangulate5points.m 函数实现基于双目的场景三维重建。
    步骤:
  • 在 Matlab 中调用双目校对后的内外参数据进行场景三维重建。
  • 使用 PLY 格式保存重建出的场景模型文件(如 .ply 格式)。
    输出:生成一个 .PLY 格式的场景模型文件,并在文本中提供该文件的位置信息及解析规则说明。

代码示例
`matlab
% 相机标定示例
% 加载左摄像头数据
load('calibdataleft.mat');
% 加载右摄像头数据
load('calibdataright.mat');
% 双目校准示例
% 加载双目数据
load('CalibResultsstereo.mat');
% 使用 stereo_gui 进行重载和优化(已加载左、右摄像头数据)
% 在命令窗口运行 stereo_gui 并完成相关操作
% 三维重建示例
% 加

文章目录

  • 相机标定技术
    • 在相机校准过程中需要考虑哪些关键因素?

      • 在内参数校准过程中需要注意哪些具体问题?

        • 在外参数校准过程中需要关注哪些关键点?
        • 立体视觉系统在实际应用中可能遇到哪些技术挑战及解决方案分析?
      • 打印棋盘格(c++)

        • 注意
      • 双目摄像头matlab手动标定

        • 标定流程
    • 三维重建

        • 双目总结 参考链接:

相机标定

标定目的:确定摄像机图像中的像素位置(基于像素坐标系)与其在场景中的实际位置(基于世界坐标系)之间的对应关系。
方法:基于该摄像机模型[
其中标定过程是实现三维重建的关键步骤。

  • 内参数 4 个:fx fy cx cy (如所提及的 kx ky u0 v0)

  • 畸变系数共 5 个:k1 k2 k3(径向畸变 如 bucket 和 pillow 形状所示 k1, k2, k5) p1 p2(切向畸变 如 bucket 和 pillow 形状所示 k3, k4)。

    • 外参 6个: 旋转矩阵 Rx Ry Rz 平移向量 tx ty tz

相机标定的数学计算公式推导过程(知乎)

注意事项

内参标定需要注意问题

制作棋盘格靶标时需要注意以下几点:首先要求黑白方格的尺寸必须相等,在实际应用中建议行列数量超过10个为宜;其次方格的大小应适当控制在20至30像素范围内;此外在拍摄过程中必须确保靶标图像中的每个棋盘格边长不小于20像素以满足精度要求;具体计算可采用如下公式:目标图像区域面积(640×480)乘以棋盘阵列比例(例如26×26)再开平方得到每个棋盘单元的实际尺寸约为10像素;然而这一数值并未达到最低要求即每个棋盘单元至少需有20像素边长以保证图像采集质量

推荐在摄像头覆盖的区域五个关键点分别进行图像采集。具体来说,在左上方、右上方、左下方、右下方以及正中央的位置进行采样。

在标定时推荐选用具有x和y轴棋盘格分布差异性的标定板(选择矩形形状的长方形标定板),这有助于程序准确识别标定板的方向。

标定板上的焦点数目会直接影响其标定精度,在9\times10的区域中通常会放置约50个标定点以确保较高的精度。

棋盘格标定板需放在摄像头的主要工作距离(摄像头的焦距范围内)

靶标相对于摄像机的角度变化具有显著范围,并要求围绕X、Y、Z三轴进行较大的旋转幅度,在此基础之上最低要求为30度以上

标定图片数量10~20副最好

在拍摄过程中,在固定配置的摄像机前无法移动。其中一些设备具备集成双眼设计,并且具有固定焦距功能;它们可以在一定范围内调节位置。

在使用MATLAB工具箱进行标定过程中,在绘制棋盘格的四个角点时(即相邻两个角点必须位于同一网格线上),完成后绘制出的四边形需大致平行于棋盘格靶标网格线。

拍摄的照片始终保持清晰(理论上说,在数字图像采集领域中通常认为分辨率越高能够更好地反映细节信息;然而在实际应用中发现当设备性能达到一定水平后继续提升分辨率反而会导致计算资源不足从而影响后续处理效率)

在图像采集过程中,在相机的工作原理决定了其内部固有参数的前提下,在实际应用中我们无法手动调节相机的焦距参数。由于相机的工作原理决定了其内部固有参数,在实际应用中我们无法手动调节相机的焦距参数。

实际坐标系中的y轴与理想坐标系中的y轴之间的夹角αc是否被校准?这取决于估计算符位est_alpha的状态。当估计算符位est_alpha置为1时,则对该角度αc进行校准处理;而当估计算符位est_alpha置为0时,则对该角度αc不进行校准处理;如图所示,在红框区域中可观察到这一参数设置情况:

数组 est_dist(1:5) 是畸变系数 kc(1:5) 是否已标定的指标,在 kc 的取值为 1 的情况下完成标定,在取值为 0 的情况下则不进行标定,默认设置为 est_dist(1:5)=[1 1 1 1 0] ,这意味着将对 k c₁ 至 k c₄ 进行标定而忽略 k c₅(此时 k c₅ 设为 0)。在运行 calib_gui 指令后系统会进入忙碌状态并暂停响应其他命令;只有当点击"Exit"键退出畸变校正工具箱操作后才能恢复命令窗口功能(在操作过程中若出现错误只能重新进行校正操作,在退出前必须使用"Exit"键强行退出)

外参标定注意问题

  • 方格尺寸必须准确设置实际大小
    • 在图像处理过程中,在图形窗口中通过首次点击确定靶标坐标系的起始位置
    • 采用rodrigues函数将姿态矩阵Rc_ext转换为旋转向量omc_ext,并生成一个3×1维度的旋转向量;同样也可以从旋转向量omc_ext还原出对应的姿态矩阵Rc_ext为一个3×3维度的空间变换关系

立体视觉标定需要注意的问题

在提取角点操作中,在图形窗口中通过鼠标点击的方式确定第一个角点作为靶标坐标系的原点。对于左右两台摄像机而言,在获取靶标图像时应当采用相同的第一个角点作为基准点。除此之外,在左右两台摄像机各自的靶标图像中标记出其余三个对应的角点,并且这些对应关系必须保持一致。值得注意的是,在实际应用中应当确保左右两台相同编号的摄像机获取的图像是同一场景下的靶标图像,并且在同一姿态下采集到的一组具有对应关系的左右两张图形成为了一个完整的立体视觉目标对。基于此计算得到的结果参数反映了左摄像机相对于右摄像机的空间位姿关系。运行 stereo_gui 指令后,在Matlab命令窗口将能够响应其他相关操作指令。

打印棋盘格(c++)

复制代码
    #include <opencv2/opencv.hpp>
    #include <iostream>
    
     /** 输出指定格式的棋盘图
    @param width 棋盘的宽度,不要超过10000.
    @param height 棋盘的高度,不要超过10000.
    @param pixel 每个格子的大小,建议行和列的格子数一个为奇数一个为偶数
    @param fileName 输出的文件名,支持相对路径和绝对路径,支持png、jpg、bmp等.
    */
    static int checkerboard(int width, int height, int pixel, const char* fileName)
    {
    if (width > 0 && height > 0 && pixel > 0 && width <= 10000 && height <= 10000 && pixel <= width && pixel <= height && fileName)
    {
        cv::Mat image = cv::Mat::zeros(cv::Size(width, height), CV_8U);
        uchar* uc = image.data;
        for (size_t j = 0; j < height; j++)
        {
            for (size_t i = 0; i < width; i++)
            {
                if ((i / pixel + j / pixel) % 2)
                {
                    uc[j * width + i] = 255;
                }
            }
        }
        imwrite(fileName, image);
        return 0;
    }
    return -1;
    }
    
    int main(int argc, char** argv)
    {
    int result = -1;
    int width = 0;
    int height = 0;
    int pixel = 0;
    const char* fileName = nullptr;
    
    if (argc == 5)
    {
        try
        {
            width = std::stoi(argv[1]);
            height = std::stoi(argv[2]);
            pixel = std::stoi(argv[3]);
            fileName = argv[4];
            result = checkerboard(width, height, pixel, fileName);
        }
        catch (const std::exception&)
        {
            std::cout << "输入格式错误" << std::endl;
        }
    }
    
    if (result == 0)
    {
        std::cout << "生成棋盘图并保存成功" << std::endl;
    }
    else
    {
        std::cout << "保存棋盘图失败" << std::endl;
        std::cout << "用法:" << std::endl;
        std::cout << "CheckerBoard.exe width height pixel fileName" << std::endl;
    }
    return result;
    }
    ## 打开双目摄像头
    ### 代码
    同时打开两个摄像头
    ```cpp
    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main() {
    
    	VideoCapture camera0(1);
    	camera0.set(CAP_PROP_FRAME_WIDTH,360);
    	camera0.set(CAP_PROP_FRAME_HEIGHT, 640);
    	camera0.get(CAP_PROP_FPS);
    	//unsigned f1 = (unsigned)camera0.get(CAP_PROP_FPS);
    	
    
    	VideoCapture camera1(0);
    	camera1.set(CAP_PROP_FRAME_WIDTH, 360);
    	camera1.set(CAP_PROP_FRAME_HEIGHT, 640);
    	//unsigned f2 = (unsigned)camera1.get(CAP_PROP_FPS);
    	//cout << "camera0 `s FPS is" << f1 << "/n camera1`s FPS is" << f2 << endl;
    
    	if (!camera0.isOpened()) cout << "could not open camera0";
    	if (!camera1.isOpened()) cout << "could not open camera1";
    
    	while (1) {
    		Mat3b frame0, frame1;
    
    		camera0 >> frame0;
    		camera1 >> frame1;
    
    		if (frame0.data && frame1.data) {
    			imshow("frame0", frame0);
    			imshow("frame1", frame1);
    		}
    		else
    			cout << "the camera `s data is empty";
    		
    		int c  = waitKey(20);
    		
    		if (27 == char(c)) break;
    		
    	}
    	int a = waitKey(20);
    	cout << "char a" << char(a) <<endl;
    
    	return 0;
    }

注意

通过该程序生成一张具有PNG格式的图片;避免直接打印该图像时可能出现质量差的情况。导入并可视化该图像于MATLAB环境中后,默认保存为图像文件;随后将该图像保存为PDF格式文件后再进行打印操作可获得更好的效果。

棋盘格的行列数量必须满足不同时为奇偶的要求** ,否则在Matlab进行标定时将收到警告信息且可能导致标定结果出现偏差。正确的命令行参数格式是:.CheckerBoard.exe 指定图像大小为宽度500像素、高度450像素、分辨率每12.5px存储一行数据(即 --Resolution=128 ),并使用 ** --Size=16x9 ** 的比例拍摄图像

打印后再用量具测量格纹尺寸可能会导致误差需要注意

3.用matlab标定。

双目摄像头matlab手动标定

标定流程

仅需完成calib_gui下的第一条(Standard)、第二条(Image Names)、第三条(Read Names)、第四条(角点提取)、第五条(Calibration)及 save 步骤,并且完成stereo_gui下的第十四步(加载与运行)。

确保所需图像被包含在Matlab当前目录中(此时代数工具箱TOOLBOX_calib必须具备支持);可以通过将工作路径添加至Matlab环境中实现这一目标(例如:addpath('G:/download/matlab_toolbox/TOOLBOX_calib')

复制代码
在matlab命令窗口运行**calib_gui**

在操作界面中包含两个选项:StandardMemory efficient 。用户可以选择其中一个进行配置:若选择Standard 选项,则一次性读取目录中的所有图像并存放在内存中(占用较多内存资源);若选择Memory efficient 选项,则逐幅读取图像时使用较少内存空间(适合对内存要求较低的情况)。完成上述内存管理设置后会调出标定工具箱操作面板进行后续操作。

复制代码
      2 下图是选择上图中  **Standard**弹出界面
在这里插入图片描述

该标定工具箱的操作界面包含16个操作按钮具体功能如下所述:
(1) “图片名称”按钮:支持指定输入文件的基本名称及其格式并将相关图片数据加载至系统内存。
(2) “读取图片名称”按钮:实现对预设图片文件的读取操作。
(3) “提取网格角点”按钮:完成对工作区边缘特征点位置的提取。
(4) “内参数标定完成”按钮:执行并完成相机内部参数的精确计算。
(5) “显示校正关系图形化展示”按钮:生成并展示相机与标定板之间的几何关系图。
(6) “按空间坐标反投影到图像平面”按钮:基于相机内外参数计算模型将三维空间中的工作区特征点投影至二维图像空间。
(7) “误差分析结果输出生成”按钮:完成对当前测量精度指标的计算并输出分析报告。
(8) “重新提取网格角点”按钮:允许用户对工作区特征点进行新增或删除操作。
(9) “增加或删除图片数据选项管理”按钮:提供灵活的数据管理功能以适应不同实验需求。
(10) “保存校正结果到指定文件夹中完成存储过程启动后将计算得到的结果数据保存于 toolbox_calib 目录下的 Calib_results.m 文件中以备后续调用。
(11) “读取校正结果快速初始化启动后可以从 toolbox_calib 目录下快速调用已保存的标准参数集以加速后续实验步骤。
(12) “退出当前状态彻底退出系统关闭所有相关窗口并释放资源以保证系统的稳定性运行状态。
(13) “计算外部参数完成程序流程启动后将根据当前配置信息精确求解出相机相对于标定板的整体姿态信息。
(14) “消除畸变生成高质量图像启动后将对原始数据应用几何校正算法生成消除几何畸变后的标准图像并保存为独立文件以便后续处理使用。
(15) “导出标定数据生成详细报告启动后将按照靶标坐标系中的平面坐标和图像坐标系中的二维坐标分别生成两个 TeX 格式的数据文件用于后续的数据可视化与分析需求满足用户的技术输出需求。
(16) “显示校正结果图形化展示启动后将在屏幕上实时呈现当前的所有校正参数配置信息包括内外参数矩阵等关键指标数值直观反映系统的运行状态和校准效果。

复制代码
选中上图中**Image names**:然后输入**L**(因为我拍摄的图片都是命名格式是L1~L23,图片的格式为j)、**j** 显示内容
在这里插入图片描述

在当前目录中放置需进行标定的拍摄图片,并确保采集到的目标校准图像可采用 bmp 、jpg 等不同格式;需要注意的是,在进行目标校准时所使用的目标校准图像必须保持相同的文件格式以确保准确性。同时,在 Matlab 图形窗口中将展示23幅目标校准图,并标注为图1

在这里插入图片描述
复制代码
提取角点,标定工具箱操作面板点击“**Extract grid corners**”键:

当Matlab命令窗口显示"Number(s) of image(s) to process ([] = all images) ="时,在输入行中键入要进行角点提取的目标图像编号并按回车键。仅按回车键则采用默认设置值5像素。如果选择了其他数值,则会相应地修改窗宽和窗高参数设置为相应的数值(单位均为像素)。

当Matlab命令窗口显示"Window size for corner finder (wintx and winty):"时,在两个输入行中分别依次输入相应的数值:wintx参数设置为( []=5 )像素宽度的一半(单位为像素),winty参数设置为( []=5 )像素高度的一半(单位为像素)。注意:这两个参数的具体含义如下:wintx表示水平方向上的窗口半宽(half-width),winty表示垂直方向上的窗口半高(half-height)。

在Matlab命令窗口出现" Do you want to use the automatic square counting mechanism (0=[]=default) or do you always want to enter the number of squares manually (1, other)? "时,请选择选项0以启用自动计算棋盘格靶标选定区域内的方格行列数功能(该功能默认开启),或者选择选项1以手动输入方格行列数来完成该功能的操作设置。

在这里插入图片描述
  • 在提取角点的过程中,会出现无法检测出方格数目的情况

需要注意的地方在于,在输入棋盘格时,在x和y两个方向上确定的小方块数量。计算时,默认从棋盘边缘的角点开始统计内部的小方块数量。如图所示。

这个上图即为X轴方向排列了5个正方形、Y轴方向排列了7个正方形。这里绝对不可以出错!一旦出现错误、整个棋盘格图案将会无法有效识别出任何棋盘图案。

在Matlab命令窗口显示"沿X方向每个方格的大小([]设置为100毫米)= Size dX of each square along the X direction ([ ]=100mm)"和"沿Y方向每个方格的大小([]设置为100毫米)= Size dY of each square along the Y direction ([ ]=100mm)"时会显示提示信息并等待设置方格长度和宽度(单位:mm)。此时实际测量到的实际长度为3毫米。请注意,默认情况下(缺省值)方格长度和宽度均为100毫米

(a)靶标选定区域

(b)角点提取结果

复制代码
    标定时一幅图像出现错误时,需要重新开始标定,退出连续输入两次 Ctrl+c,重新标定时需要先输入clear(清空缓存数据),再输入clc(清空程序),再次输入calib_gui命令
复制代码
内参数标定:对用于标定的每一幅靶标图像进行角点提取后,在标定工具箱操作面板点击Calibration键,即可完成摄像机的内参数标定

内参数标定时,在Matlab工具箱中首先执行初始化操作(即初始化过程),其核心步骤包括:以图像中心点坐标的数值作为主点坐标的初始设定值;通过平面靶标网格计算消失点进而估算出摄像机的内参数(其中畸变初始值设为零)。该工具箱采用Brown双目成像模型来处理镜头畸变问题,在该模型中包含径向畸变与切向畸变两种类型;为了简化计算并减少自由度,在本系统中假设摄像机坐标系中的x轴与y轴严格正交(即u-v坐标系与归一化成像平面坐标系之间实现完全解耦),因此设置缩放因子k s = 0;最终采用四参数内参数模型进行建模运算。在实际应用中,默认情况下将k c (1:5)设为待估计未知数;为了区分不同级别的畸变影响,在状态标记变量est_dist中设置了五个标志位(est_dist(1:5)),只有当对应位取值为1时才会对相应的畸变系数进行估计;而当标志位取值为0时,则表示该级别的畸变系数不再参与标定运算。需要注意的是:est_dist数组中的每个元素都对应一个具体的畸变系数k c (i),其中k c (1)对应于二阶径向畸变项、k c (2)对应于四阶径向畸变项、k c (5)对应于六阶径向畸变项;而k c (3)与k c (4)分别用于描述u方向与v方向上的切向畸变影响(即x-y项的影响)。为了衡量反投影误差的质量,在优化过程中采用了误差的标准差量化指标σ err ,其单位同样为像素:σ err 的数值越小,则表明所获得的标定解具有较高的可靠性;反之则可能需要重新审视当前的标定结果是否满足精度要求。

经过上述步骤完成内外参数标定后所获得的结果主要包括两个部分:第一部分是初始配置下的标定结果;第二部分则是经过优化算法处理后的精确解。在输出信息中特别需要注意的是:对于各待估计未知数的状态信息,默认情况下它们都被赋予了零初始猜测值;只有那些被标记为可估计对象(即估计算子)才允许通过迭代求解过程获得最终确定的结果值。

复制代码
  显示摄像机与标定靶标之间的关系,完成内参数标定后,在标定工具箱操作面板点击“Show Extrinsic”

在新的图形窗口中呈现摄像机与标定靶标之间的相互关联关系, 如图所示, 其中(a)展示了摄像机固定情况下摄像机与靶标的关联情况, 而(b)则探讨了靶标固定时的相互关联关系

(a)摄像机固定

(b)靶标固定

复制代码
误差分析,在标定工具箱操作面板点击“Analyse error”

通过新的图形窗口展示了基于标定的所有角点反投影至图像空间的位置误差(如 图所示)。在此显示界面中,通过移动十字光标可以选择指定的角点位置,并即可实时显示选定角点的相关信息。这些信息包括:所选角点所属的基础图像文件及其索引号;以方格划分单位表示的具体坐标;对应的原始图像平面坐标;经过反投影计算后的重建位置误差;以及用于限定提取区域的角度范围参数——即该区域在水平方向上的半宽度m和垂直方向上的半高度n。

在命令窗口中显示的选取角点后的信息如下:
选取的图像编号为:20
选取的点索引号为:9
pattern坐标(单位为dX,dY):(X,Y)=(1,5)
图像坐标(像素坐标):(193.89,233.60)
像素误差值为:(-0.55198, 0.08816)
窗口尺寸参数为:(win_tx, win_ty) = (4,4)

复制代码
  反投影到图像空间完成内参数标定后,在标定工具箱操作面板点击“Project on image”

当Matlab命令窗口显示"Number(s) of image(s) to process ([] = all zmages)= "时, 你需要按照以下步骤操作: 首先, 输入所需进行反投影处理的目标图标的编号, 然后按回车键执行操作. 如果你直接按回车键而没有输入任何编号, 则系统将采用默认参数设置. 一旦选择了默认参数, 系统会自动完成所有目标图标的校正工作. 确认目标后, 在新的图形界面中展示当前选中图标的清晰度评估指标, 并在终端输出所有目标图标的角点坐标及其误差统计. 如图(b), 所选目标Image2 的实际角点(用'+'表示)与其经校准后的像平面位置(用'o'表示)被精确绘制在同一幅图中.

反投影到图像空间的角点图像坐标误差

Image2 的角点反投影结果

复制代码
  图像畸变校正,完成内参数标定后,在标定工具箱操作面板点击“Undistort image

基于畸变校正系数对输入的所有目标标定图像完成处理操作后生成去畸变图像,并将其存储于当前工作目录中。对于去畸变后的图像文件,在原始文件名的基本名与编之间插入_rect作为扩展名保存。

原始图像

消除畸变后的图像

复制代码
增加/ 删除图像在标定工具箱操作面板点击Add/Suppress image

在命令窗口中输入用于增加和删除图像的数字代码。然后依次输入要操作的图像编号。可选择将第7步中误差较大的图像删除,并重新执行标定过程。
点击Add or Suppress Image 显示相关信息。

在命令窗口中输入用于增加和删除图像的数字代码。然后依次输入要操作的图像编号。可选择将第7步中误差较大的图像删除,并重新执行标定过程。
点击Add or Suppress Image 显示相关信息。

再次执行第5步的calibration过程后,系统将对剩余的图片进行重新校准;同时,在处理完前6张图片后,请确保移除在第7张图片之前设置的所有参数设置。

删除第7张图片之后的参数:

接着再次执行第7步 通过系统性的误差分析评估结果数据集的质量,并筛选出存在明显偏差的图片样本作为异常值予以剔除。随后会对剩余的数据样本重新建立标定模型并完成相关验证测试。按照编号顺序重复上述步骤(编号为7至9的操作,并结合5号步骤),直至达到预期的精度要求(最好不超过0.3的误差范围)。

复制代码
重新提取网格角点,完成内参数标定后,在标定工具箱操作面板点击Recomp. corners

在操作界面中输入用于确定角点提取区域的水平半宽m值及垂直半高n值;随后输入需要重新提取网格角点的图像编号;选择采用冲投影方式进行成像后再对所选图像执行一次新的角点提取操作即可完成内参数标定工作流程。经过再次精确定位后可进一步优化内参数标定结果(此处建议仅在必要时执行该步骤)。若初始定位效果理想,则无需再进行网格角点的重置操作即可进入双目立体标定阶段。(此提示仅适用于单目标定场景)注:此重置网格角点的操作是在第10步增删减图片后针对剩余图片执行。

复制代码
外参数标定标定,工具箱操作面板点击Comp. Extrinsic

外参数标定是在内参数已知的前提下进行的。在外参数标定过程中,必须先确定摄像机的内参数。完成内外参设置之后,可以在命令窗口中输入相应的信息即可启动外参数标定过程。通过指定目标图像文件名及其格式来进一步初始化系统设置。按照第4步所述的方法自动识别并提取目标物体上的特征点(即棋盘格板上的角点)。

基于给定图像计算相机姿态信息的过程如下:首先假定期望矩阵已知,随后在命令窗口中指定目标图像文件名及其格式,系统将自动读取并处理该文件内容;接着启动外参估计算法,该算法将根据预设的目标物尺寸以及定位到的目标物角点位置来计算相机的姿态信息;最后将计算得到的结果返回给用户,供后续使用或验证。

外参估计结果如下:平移矢量 Tc_ext = [-531.674715 400.142025 1999.135937] mm;旋转矢量 omc_ext = [2.258838 -0.002845 0.157413];旋转矩阵 Rc_ext = [0.992075 -0.055515 0.112716; 0.051405 -0.639246 -0.767282; 0.114649 0.766996 -0.631327];此外还计算得到了像素误差 err = [0.14406 0.10]px作为评价指标

需要注意的是,此处所描述的过程仅针对单一对比校正的情况,具体实现细节可参考相关文献或技术支持文档

复制代码
单击Save保存标定结果(内参和外参)到matlab文件Calib_Results.mat

在此阶段会生成三个数据文件:calib_data.mat、Calib_Results.m(标定后的内参、外参数据)以及Calib_Results.mat。在双目立体标定过程中会用到Calib_Results.mat这一关键数据集。为了便于区分左右摄像头的标定结果并简化后续操作,在对上述三个主要文件进行命名时需特别注意:将calib_data.m系列文件分别命名为calib_data_left.mat、Calib_Results_left.m(标定后的内参、外参数据)以及Calib_Results_left.mat。完成左摄像头标定后,请按照相同的操作流程完成右摄像头的标定工作。随后创建一个名为'left-right'的新文件夹,并将Calib_Results_left.mat与Calib_Results_right.mat复制到该存储位置上以备后续双目立体视觉处理所需

复制代码
进行双目立体视觉标定,命令窗口运行 stereo_gui 指令(此时可以输入其他命令,不会对stereo_gui 指令产生影响)

操作之前要求在MATLAB当前目录中已打开了名为"left-right"的文件夹;系统会弹出显示立体视觉标定工具箱的窗口。

图所示的标定工具箱操作面板具有 8 个操作命令键,其功能如下:

在图所示的操作面板中,请按【Import left and right calibration files

复制代码
    >> stereo_gui
    //显示找到了两个 .mat文件
    Calib_Results_left.mat   
    Calib_Results_right.mat  
    
    Loading of the individual left and right camera calibration files
    //直接回车
    Name of the left camera calibration file ([]=Calib_Results_left.mat): 
    Name of the right camera calibration file ([]=Calib_Results_right.mat):

随后,在命令窗口中将显示以下内容:
当前已获得一个双目标定配置。
无论是在点击立体标定界面的Run按钮后进行操作还是在其间进行任何参数调整后(只要未保存配置),最终标定结果如图所示。
其中问号表示正负号。

复制代码
    Stereo calibration parameters after loading the individual calibration files:
    
    Intrinsic parameters of left camera:
    
    Focal Length:          fc_left = [ 461.33213   461.80529 ] ? [ 5.37203   5.53090 ]
    Principal point:       cc_left = [ 326.86008   191.73841 ] ? [ 4.06360   3.33579 ]
    Skew:             alpha_c_left = [ 0.00000 ] ? [ 0.00000  ]   => angle of pixel axes = 90.00000 ? 0.00000 degrees
    Distortion:            kc_left = [ -0.34435   0.08697   -0.00213   0.00896  0.00000 ] ? [ 0.01799   0.04751   0.00171   0.00189  0.00000 ]
    
    
    Intrinsic parameters of right camera:
    //fc_right = [fx fy]
    Focal Length:          fc_right = [ 465.93732   464.99997 ] ? [ 3.98137   4.10118 ] 
    //cc_right = [cx cy]
    Principal point:       cc_right = [ 351.15049   219.87566 ] ? [ 3.03929   3.09094 ]
    Skew:             alpha_c_right = [ 0.00000 ] ? [ 0.00000  ]   => angle of pixel axes = 90.00000 ? 0.00000 degrees
    //畸变
    Distortion:            kc_right = [ -0.41316   0.20181   -0.00858   -0.00020  0.00000 ] ? [ 0.01337   0.03992   0.00149   0.00130  0.00000 ]
    
    
    Extrinsic parameters (position of right camera wrt left camera):
    //双目左右摄像头之间的旋转矩阵 (在调用到opencv中时,需要将此om 3*1 函数矩阵利用rodrigues转换为3*3矩阵)
    Rotation vector:             om = [ -0.01436   -0.01585  0.00451 ]
    //双目左右摄像头之间的平移矩阵
    Translation vector:           T = [ 3.78695   0.48593  1.19456 ]

在显示的结果中,
fc_{left} 是左摄像头归一化后的放大部分值,
它决定了从成像平面上到图像坐标的转换关系。
cc_{left} 表示左摄像头的主要焦点位置,
其单位是以像素来表示坐标的。
alpha_{c\_left} 表示实际Y轴与理论Y轴之间存在的角度偏差,
通常以弧度计,
默认情况下设为0弧度。
kc_{left} 则记录着Left摄像头所引入的各种几何畸变信息。
类似地,
fc_{right}cc_{right} 分别对应于Right摄像头
的基本几何参数。
同样地,
alpha_{c\_right} 描述了Right摄像头在Y轴方向上的偏差情况,
默认也为0弧度。
kc_{right} 则记录着Right摄像头所引入的各种几何畸变信息。
姿态矩阵om则表示Left相对于Right的位置关系,
通过调用该函数可以实现这一姿态转换关系的操作过程

复制代码
     rodrigues(om)
    ans =
    0.9999   -0.0044   -0.0159
    0.0046    0.9999    0.0143
    0.0158   -0.0144    0.9998

T 代表左摄像机坐标系原点相对于右摄像机坐标系的位置偏移量(单位:毫米)。

The 'Execute stereo calibration' key: computes optimized extrinsic parameters.
Upon clicking the 'Run stereo calibration' key on the interface shown in Figure 1, Matlab command window outputs the intrinsic parameters of left and right cameras along with **the optimized extrinsic parameters of the system.

复制代码
    Intrinsic parameters of left camera:
    
    Focal Length:          fc_left = [ 461.12434   461.37064 ] ? [ 3.48885   3.56865 ]
    Principal point:       cc_left = [ 329.22046   193.48711 ] ? [ 3.01946   2.48266 ]
    Skew:             alpha_c_left = [ 0.00000 ] ? [ 0.00000  ]   => angle of pixel axes = 90.00000 ? 0.00000 degrees
    Distortion:            kc_left = [ -0.36183   0.12527   -0.00123   0.00799  0.00000 ] ? [ 0.01522   0.03779   0.00123   0.00154  0.00000 ]
    
    
    Intrinsic parameters of right camera:
    
    Focal Length:          fc_right = [ 457.11660   455.65037 ] ? [ 3.53015   3.62935 ]
    Principal point:       cc_right = [ 357.70610   230.55749 ] ? [ 2.76606   2.61944 ]
    Skew:             alpha_c_right = [ 0.00000 ] ? [ 0.00000  ]   => angle of pixel axes = 90.00000 ? 0.00000 degrees
    Distortion:            kc_right = [ -0.39274   0.15856   -0.01265   -0.00196  0.00000 ] ? [ 0.01462   0.04002   0.00122   0.00131  0.00000 ]
    
    
    Extrinsic parameters (position of right camera wrt left camera):
    
    Rotation vector:             om = [ 0.00050   -0.01997  0.00433 ] ? [ 0.00487   0.00624  0.00044 ]
    Translation vector:           T = [ 3.49937   0.16669  0.13076 ] ? [ 0.02401   0.01655  0.10727 ]

此键的作用是呈现靶标相对于摄像机的外参信息...通过图示直观展示该信息。

  • 显示内参数 键:在 Matlab 命令窗口中展示左右相机的内部参数及其优化后的外部参数信息,并将通过运行"运行立体校准"(Run stereo calibration)所得出的参数值在此窗口中进行重复显示。
    • 存储立体校准结果 ”键:将校准数据以文件名 Calib_Results_stereo.mat 的格式保存至当前位于“left-right”目录中的文件夹中。
    • 加载立体校准结果 ”键:从位于“left-right”目录中的文件 Calib_Results_stereo.mat 中读取校准数据。
    • 纠正校正图像畸变 ”键:基于畸变系数对左、右相机捕获的所有目标标靶图像进行处理操作,并生成去畸变后的图像文件存入预先创建的新文件夹 left-right_stereo(将捕获的所有原始左右相机照片拷贝到该文件夹中)。纠正后的图像采用与原始命名相同的基名和编号,在其名称中插入 _rectified 作为后缀以区分。
    • 退出程序 ”键:退出立体视觉标定过程。

三维重建

双目总结 参考链接:

三维重建与定位技术综述
基于Matlab的双目摄像头APP自标定系统开发
markdown数学公式
markdown数学符号

全部评论 (0)

还没有任何评论哟~