制作标定板——Matlab编程实现

举报
一颗小树x 发表于 2021/06/19 20:49:10 2021/06/19
【摘要】 传感器其标定时,需要用到标定板;可能是单传感器标定,例如:摄像头标定,获取内参。可能是多传感器之间标定,最近在做感知融合,需要激光雷达和摄像头标定,本文记录下使用matlab,来制作标定板。

前言

传感器其标定时,需要用到标定板;可能是单传感器标定,例如:摄像头标定,获取内参。可能是多传感器之间标定,最近在做感知融合,需要激光雷达和摄像头标定,本文记录下使用matlab,来制作标定板。

 一、编程基础

核心函数:checkerboard( )

使用方式有三种,分别如下:

  • I = checkerboard;
  • I = checkerboard(n);
  • I = checkerboard(n,r,c);

含义解释: n是指每个格子的像素大小;r 是指行数;c 是指列数。

 

二、基本版——实现效果

2.1)I = checkerboard;

代码如下:默认创建一个8*8的矩阵,像素是10;

figure;
I = checkerboard;
imshow(I)

其中,figure 是指创建一个面板,待会用来显示标定图;imshow(I) 就是显示的作用啦。

I 本质是一个矩阵;大小是80*80;用size函数可以查看的,即:size(I)

 

2.1)I = checkerboard(n);

代码如下:默认创建一个8*8的矩阵,像素是n,可以自由设定,但需要是正整数,比如20;

figure;
I = checkerboard(20);
imshow(I)

 

3)I = checkerboard(n,r,c);

代码如下:创建一个黑色格子、白色格子哥2行3列的棋盘格,即4*6的矩阵,像素是100;

figure;
I = checkerboard(100, 2, 3);
imshow(I)

 

三、进阶版—消除灰色部分

创建一个黑色格子、白色格子哥2行3列的棋盘格,即4*6的矩阵,像素是100;没有灰色效果:

代码如下:

figure;
I = checkerboard(100,2,3);
K = (I > 0.5);
imshow(K);

 

四、保存标定板

主要函数是:imwrite( )

代码如下:

figure;
I = checkerboard(100,2,3);
K = (I > 0.5);
imshow(K);
imwrite(K,'cher_2_3.jpg');

保存标定板所在的位置,在显示的画面,点击另存为,就可以查看标定板保存的路径。

注意:使用imwrite( )函数保存生成的标定板图片;不要直接使用另存为的图片;如果问为什么?建议尝试一下,会发现另存为的图片,会改变原格式的,即标定板的像素被改变了。

 

五、进阶版—符合规格的标定板

首先观察下这两个标定板的差别:

 偶数 * 奇数;棋盘格中,其中一个边包含偶数个正方形,另一边包含奇数个正方形。

 

偶数 * 偶数;棋盘格中,其中一个边包含偶数个正方形,另一边也是包含偶数个正方形。

通常参考官方的指南,只能生成偶数 * 偶数 的棋盘格;看网上大多数的教程,都是这种。

官方标定板的指南:https://ww2.mathworks.cn/help/images/ref/checkerboard.html

 

但是,在标定工作中,对标定板是有要求的,比如需要:棋盘格标定板,其中一个边包含偶数个正方形,另一边包含奇数个正方形。方形图案可以为相机外在元素产生意想不到的结果。比如:标定板的方向可能检测不正确。

这个问题也困惑了我2个小时,才解决了,分享一下。

 

六、偶数 * 奇数棋盘格—标定板

明亮的一半是符合奇偶数边的要求;

figure;
I = checkerboard(100,5,9);
imshow(I);
imwrite(I,'cher.jpg');

先思考下,创建棋盘格的核心函数是checkerboard( );创建出来的对象,本质是一个矩阵;那就好解决啦,先观察矩阵规律,然后提取或分割就可以啦。

查看I的尺寸:(本来的大小)

>> size(I)

ans =  1000        1800

 

然后,截取矩形中的一半就可以啦。

 

分割出来

figure;
I = checkerboard(100,5,9);
imshow(I(:,1:900));
imwrite(I(:,1:900),'cher.jpg');

 

通用代码

生成10行 9列的棋盘格-标定板 

boardsize = 100; % 每个格子大小,单位:像素
r = 10; % 行数
c = 9; % 列数
% 下面进行制止棋盘格
figure;
I = checkerboard(boardsize, r/2, c);
imshow(I(:,1:boardsize*c));
imwrite(I(:,1:boardsize*c),'cher.jpg');

标定板符合matlab标准:

https://ww2.mathworks.cn/help/lidar/ug/lidar-camera-calibration-guidelines-and-procedure.html

 

A3纸大小,生成8行 5列的棋盘格-标定板 

boardsize = 620; % 每个格子大小,单位:像素
r = 8; % 行数
c = 5; % 列数
% 下面进行制止棋盘格
figure;
I = checkerboard(boardsize, r/2, c);
imshow(I(:,1:boardsize*c));
imwrite(I(:,1:boardsize*c),'cher_8_5_ok.jpg');

标定板符合matlab标准:

https://ww2.mathworks.cn/help/lidar/ug/lidar-and-camera-calibration.html

 

如果觉得不错点个赞啦;欢迎交流~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。