制作標定板——Matlab編程實現
前言
傳感器其標定時,需要用到標定板;可能是單傳感器標定,例如:攝像頭標定,獲取內參??赡苁嵌鄠鞲衅髦g標定,最近在做感知融合,需要激光雷達和攝像頭標定,本文記錄下使用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
如果覺得不錯點個贊啦;歡迎交流~
MATLAB
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。