matlab单双目标定提取相机标定中各张标定图片的重投影误差数据

前言

  我们在使用matlab工具箱进行相机标定时,有时候想得到每张标定图片的重投影误差和opencv-python中的比较一下。然而,该数据在系统里没有直接输出,我们应该如何获取呢?
在这里插入图片描述

  参考了 《提取相机标定中各张标定图片的重投影误差数据》中的思路给出单双目代码,直接粘贴使用!
思路如下:
1 、提取角点坐标的像素坐标;
2 、将标定板中角点在世界坐标中的坐标(标定平面为世界坐标系中Z=0所在平面)基于相机参数反计算得到新的像素坐标;
3 、计算两个对应像素坐标的2范数求和并取均值,即可得到该张标定图片的平均投重影误差。


一、单目标定

启动单目标定工具箱

cameraCalibrator

添加照片,选择calibrate,选择export camera parameters,点击确定
在这里插入图片描述
然后在主窗口输入以下代码,把图片数量和角点个数改成自己的,就可以得到我们想要的数据了

Error=0;
num=9;     %标定图片的张数
corner=55;  %标定板角点提取的个数
for i=1:num  
    s=0;
    v1=0;
    A=cameraParams.ReprojectionErrors(:,:,i);
    for j=1:corner
        v=[A(j,1),A(j,2)];
        v1=norm(v);
        s=v1+s;
    end
    value=s/corner;    
    fprintf('%f\n', value);
    Error=Error+value;
end

二、双目标定

  启动双目标定工具箱

stereoCameraCalibrator

添加左目和右目照片,选择coefficients和tangential distortion ,点击calibrate在这里插入图片描述然后选择export camera parameters,点击确定在这里插入图片描述
在主界面上就可以看到输出
在这里插入图片描述
然后复制代码到下面运行,就可以输出两个相机的参数了,根据识别识别出来的照片数量和你自己棋盘角点修改一下就可以了。

Error1=0;
Error2=0;
num=5;     %标定图片的张数
corner=88;  %标定板角点提取的个数
for i=1:num  
    s1=0;
    v1=0;
    A=stereoParams.CameraParameters1.ReprojectionErrors(:,:,i);
    for j=1:corner
        v1=[A(j,1),A(j,2)];
        v1=norm(v1);
        s1=v1+s1;
    end
    value1=s1/corner;    
    fprintf('%f\n', value1);
    Error1=Error1+value1;
end
fprintf("---------\n");
for i=1:num  
    s2=0;
    v2=0;
    B=stereoParams.CameraParameters2.ReprojectionErrors(:,:,i);
    for j=1:corner
        v2=[B(j,1),B(j,2)];
        v2=norm(v2);
        s2=v2+s2;
    end
    value2=s2/corner;    
    fprintf('%f\n', value2);
    Error2=Error2+value2;
end

结果如下:
在这里插入图片描述

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
是的,文和英文的双引号不完全相同。在,常用的引号有“”和‘’两种,分别表示双引号和引号。而在英文,常用的引号有""和''两种,同样表示双引号和引号。 在 Java ,如果要匹配文或英文的双引号,需要根据具体情况来选择正则表达式。以下是一些示例代码,演示了如何匹配英文的双引号: 1. 匹配文双引号: ```java String str = "这是一段包含“文”双引号的字符串"; String regex = "“(.*?)”"; // 匹配文双引号括起来的部分 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); while (matcher.find()) { String match = matcher.group(1); // 获取匹配的部分(不包含引号) System.out.println(match); // 输出:文 } ``` 2. 匹配引号: ```java String str = "这是一段包含‘文’引号的字符串"; String regex = "‘(.*?)’"; // 匹配引号括起来的部分 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); while (matcher.find()) { String match = matcher.group(1); // 获取匹配的部分(不包含引号) System.out.println(match); // 输出:文 } ``` 3. 匹配英文双引号: ```java String str = "This is a 'quoted' string containing \"double\" and 'single' quotes"; String regex = "\"(.*?)\""; // 匹配英文双引号括起来的部分 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); while (matcher.find()) { String match = matcher.group(1); // 获取匹配的部分(不包含引号) System.out.println(match); // 输出:double } ``` 4. 匹配英文引号: ```java String str = "This is a 'quoted' string containing \"double\" and 'single' quotes"; String regex = "'(.*?)'"; // 匹配英文引号括起来的部分 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); while (matcher.find()) { String match = matcher.group(1); // 获取匹配的部分(不包含引号) System.out.println(match); // 输出:single } ``` 注意,在匹配文引号时,需要使用对应的文引号字符(如“和’),而不是英文引号字符(如"和');在匹配英文引号时,则需要使用对应的英文引号字符。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张Tt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值