MATLAB工具箱进行双目相机的标定无法获得内参

使用MATLAB工具箱进行双目相机的标定,导出参数,没有内参,使用的是MATLAB2022b版本。

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7473100
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:MATLAB张正友标记法对双目摄像头进行标定
  • 除此之外, 这篇博客: 用MATLAB对图像进行量化处理中的 用MATLAB对图像进行量化处理 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    一、实验目的:掌握量化原理

    二、实验内容:试对lenagray.jpg图像分别量化为64级灰度图像、32级灰度图像、8级灰度图像和4级灰度图像,观察图像质量的变化



    第一幅图是原图,第二幅图是不同量化程度对应的图像

    代码如下:

    %将界面上的内容全部清空
    clc;
    clear;
    close all;
    I=imread('D:/Mypicture/lenagray.jpg');
    I64=histeq(I,64);%将图像的灰度级数改为64
    I32=histeq(I,32);%将图像的灰度级数改为32
    I16=histeq(I,16);%将图像的灰度级数改为16
    I8=histeq(I,8);%将图像的灰度级数改为8
    I4=histeq(I,4);%将图像的灰度级数改为4
    I2=histeq(I,2);%将图像的灰度级数改为2
    figure;
    subplot(2,3,1),imshow(I64),title('64x64');
    subplot(2,3,2),imshow(I32),title('32x32');
    subplot(2,3,3),imshow(I16),title('16x16');
    subplot(2,3,4),imshow(I8),title('8x8');
    subplot(2,3,5),imshow(I4),title('4x4');
    subplot(2,3,6),imshow(I4),title('2x2');


  • 您还可以看一下 苏金明老师的MATLAB编译器课程中的 MATLAB编译器的基本功能和使用步骤小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    根据提供的信息,可能出现无法获得相机的内参的原因是相机标定失败,或者是标定精度不够高导致内参无法正确计算出来。以下是可能的解决方案:

    1. 检查所使用的图片是否满足标定的要求,至少需要15-20张具有不同姿态的图片来进行标定。同时,图片需要质量足够好,没有过多的噪声和模糊。也需要保证图片中的标定板占据与整个图片相似的面积。

    2. 在提取角点时,需要设置适当的窗口大小以及按照指定的方式正确选择角点,建议按顺时针方向选取四个角点。可以通过 Recomp. corners 按钮提高标定精确度。

    3. 查看标定结果中的误差值,如果误差值太大(大于3),说明标定精度不够高,可以通过增加参与标定的图片数量,或者更换标定板来提高标定精度。

    4. 如果仍然无法获得相机的内参,可以考虑使用其他相机标定工具或者重新采集并标定图片。

    以下是一些MATLAB的代码示例:

    载入图片:

    % 输入需要处理的图片数目,默认回车为刚才导入的全部图片
    % 选择默认的 corner finder 窗口大小(就是十字光标),wintx=winy=5
    imageFileNames = {'image1.jpg','image2.jpg',...};
    [imagePoints,boardSize] = detectCheckerboardPoints(imageFileNames);
    

    提取角点:

    % 通过 Recomp. corners 按钮提高标定精确度;
    % 角落提取引擎含有自动计算方块个数的系统
    squareSize = 30; % mm
    worldPoints = generateCheckerboardPoints(boardSize, squareSize);
    % 进行上述角点提取操作(第一次标定必须很麻烦的一幅一幅的操作)
    %
    % 角点提取完毕后,运行以下代码生成一个变量 imagePoints,包含每个照片中检测出的检测板角点在图像坐标系下的坐标
    % 在双目标定中,需要分别对左右图像计算 imagePoints
    

    实施标定:

    % 运行以下命令,生成变量 cameraParams,包含内参以及外参
    cameraParams = estimateCameraParameters(imagePoints, worldPoints);
    % 展示相机内参
    cameraParams.IntrinsicMatrix
    % 展示相机旋转矩阵和平移向量
    cameraParams.RotationMatrices
    cameraParams.TranslationVectors
    

    保存标定结果:

    % 运行以下命令,将标定结果保存到文件中
    save('Calib_Result_left.mat', 'cameraParams');
    % 右侧摄影机同理
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

双目相机的标定是将两个摄像机的内参和外参参数求解出来,从而实现三维空间中的点与图像坐标之间的转换。在使用MATLAB工具箱进行双目相机的标定时,如果无法获得内参参数,可能有以下几种原因:

标定板不适合:标定板必须采用高精度的制造工艺,并且必须满足一定的要求,例如正交性、平整性等。如果标定板不符合要求,则会导致标定结果不准确。

图像质量差:如果图像质量不好,例如存在较大的畸变、噪声或者模糊等问题,都会导致标定结果不准确。因此,在进行标定前需要对图像进行预处理,例如去除畸变、降噪等操作。

标定参数设置错误:在进行标定时,需要设置一些参数,例如标定板大小、角点数量等。如果这些参数设置不当,也会导致标定结果不准确。

算法选择错误:MATLAB工具箱提供了多种标定算法,例如Tsai算法、Zhang算法、Bouguet算法等。不同的算法适用于不同的场景,如果选择的算法不适合当前场景,也会导致标定结果不准确。

针对以上问题,可以采取以下措施:

更换标定板:使用具有高精度制造工艺的标定板,或者自己制作一个较好的标定板。

改善图像质量:对于存在畸变、噪声等问题的图片进行预处理,例如去除畸变、降噪等操作。

调整标定参数:根据具体情况调整标定参数,例如标定板大小、角点数量等。

尝试不同算法:使用不同的算法进行标定,找到适合当前场景的算法。