ROS官方提供了用於單目或者雙目標定的camera_calibration包。這個包是使用OpenCV裡的張正友標定法,所以如果你有使用opencv標定的經驗,可以直接標定,而不使用官方的程式。

        官方也給出了單目的標定教程雙目視覺的標定教程。本教程基於usb_cam  package 讀取影象,然後使用官方例程進行標定。

1.使用usb_cam 讀取影象,launch檔案(usb_cam-test.launch)如下:

<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
  </node>
</launch>

 copy

開啟一個終端,執行:

$ roscore

開啟另一個終端,執行:
$ roslaunch usb_cam usb_cam-test.launch
開啟筆記本攝像頭。

2.檢查usb_cam package釋出的訊息:

  1. $ rostopic list  
看是否有如下訊息,並記住名稱
  • /usb_cam/camera_info
    /usb_cam/image_raw

3.啟動標定程式:

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

view p其中引數size 8x6 注意:中間是字母x,他是棋盤內部角點個數,如下圖所示。square為棋盤正方形邊長,注意:剛剛開始標定的時候,CALIBRATE按鈕是灰色的。

                         

4.標定程式使用方法:

       為了得到一個好的標定結果,應該使得標定板儘量出現在攝像頭視野的各個位置裡:

       如標定板出現在視野中的左邊,右邊,上邊和下邊,標定板既有傾斜的,也有水平的,。

       介面中的x:表示標定板在視野中的左右位置。

                     y:表示標定板在視野中的上下位置。

                size:標定板在佔視野的尺寸大小,也可以理解為標定板離攝像頭的遠近。

                skew:標定板在視野中的傾斜位置。

              

還要有棋盤佔住大部分視野的圖片,如下圖所示:


       按著上述方式不斷移動標定板,直到CALIBRATE按鈕變亮,點選該按鈕就會進行標定。標定過程將持續一兩分鐘,並且標定介面會變成灰色,無法進行操作,耐心等待即可。

       標定完成以後,你將看到如下圖所示的視窗,視窗中的影象為標定後的結果,糾正了畸變

                           

        並且,攝像機的各個引數會出現在標定程式的終端視窗中,如下:

    

如果對標定結果滿意,點選COMMIT按鈕將結果儲存到預設資料夾,在usb_cam視窗中可以看到如下資訊,說明標定結果已經儲存在相應資料夾下下次啟動usb_cam節點時,會自動呼叫。


reference: