1. 程式人生 > >ROS單目攝像機的標定

ROS單目攝像機的標定

1.準備工作

首先,請在這裡下載標定板。教程中使用的是8X6,邊長為108mm的棋盤標定板。由於標定過程使用的是棋盤內部的角點進行,所以實際上我們使用的是9格X7格的棋盤標定板
請確保標定環境擁有一個5m×5m的無遮擋環境

1.1編譯

執行一下指令

$ rosdep install camera_calibration

1.2訂閱攝像頭資訊

$ rostopic list

來查閱當前釋出的topic資訊,請確認topic的列表中存在
/camera/camera_info
/camera/image_raw
如果不存在,請檢查你的攝像頭驅動是否正確安裝
TIP:如果當前電腦連線了多個攝像頭,或者你使用了自己編寫的一些攝像頭驅動,顯示的資訊可能會有一些不同

2.執行標定節點

2.1執行節點

輸入:

$ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera

來執行標定節點的python指令碼,其中
–size 8x6 為當前標定板的大小
–square 0.108為每個棋盤格的邊長
根據標定板的不同,可以按照需求更改這兩個引數
image:=/camera/image_raw標定當前訂閱影象來源自名為/camera/image_raw的topic
camera:=/camera為攝像機名
之後,將會出現如下圖所示的UI
這裡寫圖片描述


如果沒有出現如圖所示的UI,請使用

 --no-service-check

來檢查服務結點是否工作
如果沒有看到如圖所示的彩色點,請確認–size引數是否正確,尤其注意是否將size設定為了棋盤格數而非其標定角點的數目.

2.2移動標定板

為了達到良好的標定效果,你需要在攝像機周圍移動標定板,並完成以下基本需求:
**移動標定板到畫面的最左、右,最上、下方
移動標定板到視野的最近和最遠處
移動標定板使其充滿整個畫面
保持標定板傾斜狀態並使其移動到畫面的最左、右,最上、下方
當標定板移動到畫面的最左、右方時,此時,UI的x會達到最小或滿值
同理,y指示標定板的在畫面的上下位置,size表示標定板在視野中的距離
每次移動之後,請保持標定板不動直到UI出現高亮提示
當calibration按鈕亮起時,代表你已經有足夠的資料進行攝像頭的標定,此時請按下calibration並等待一分鐘左右**

2.3取得標定結果

完成標定之後,你可以使用UI的滾動條來改變矯正後影象的尺寸,0.0表示//todo

D =  [-0.33758562758914146, 0.11161239414304096, -0.00021819272592442094, -3.029195446330518e-05]
K =  [430.21554970319971, 0.0, 306.6913434743704, 0.0, 430.53169252696676, 227.22480030078816, 0.0, 0.0, 1.0]
R =  [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P =  [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]
# oST version 5.0 parameters


[image]

width
640

height
480

[narrow_stereo/left]

camera matrix
430.215550 0.000000 306.691343
0.000000 430.531693 227.224800
0.000000 0.000000 1.000000

distortion
-0.337586 0.111612 -0.000218 -0.000030 0.0000

rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

projection
1.000000 0.000000 0.000000 0.000000
0.000000 1.000000 0.000000 0.000000
0.000000 0.000000 1.000000 0.000000

3.建立yml引數檔案

使用camera_calibration_parsers來建立一個標定引數的yaml檔案
執行

$ rosrun camera_calibration_parsers convert in-file out-file 

完成yaml轉換

4.標定引數的意義

ROS中的camera_calibration包,其程式碼實現主要使用了OpenCV中的calibration模組
一般來說,它包含以下內容:

image_width: 2448
image_height: 2050
camera_name: prosilica
camera_matrix:
  rows: 3
  cols: 3
  data: [4827.94, 0, 1223.5, 0, 4835.62, 1024.5, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [-0.41527, 0.31874, -0.00197, 0.00071, 0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
  rows: 3
  cols: 4
  data: [4827.94, 0, 1223.5, 0, 0, 4835.62, 1024.5, 0, 0, 0, 1, 0]

image_width、image_height代表圖片的長寬
camera_name為攝像頭名
camera_matrix規定了攝像頭的內部引數矩陣
distortion_model指定了畸變模型
distortion_coefficients指定畸變模型的係數
rectification_matrix為矯正矩陣,一般為單位陣
projection_matrix為外部世界座標到像平面的投影矩陣