OpenCV 相機參數(shù)標(biāo)定(Camera Calibration)

本文參考鏈接:http://www.itdecent.cn/p/9a4d9f9dfedc
感謝原博主~


本文介紹使用OpenCV程序來進行相機標(biāo)定,并根據(jù)自己的攝像機參數(shù)來修改ORB-SLAM2使用的yaml文件。

操作系統(tǒng):Ubuntu16.04 LTS
OpenCV版本:3.4.1
攝像頭:640×480像素 單目攝像頭

標(biāo)定步驟

1、找到標(biāo)定例程
進入OpenCV安裝目錄,找到samples/cpp/tutorial_code/calib3d/camera_calibration目錄,把它拷貝到一個合適的位置。(因為可能需要修改一些代碼,因此不建議直接在原目錄下使用。)

2、修改標(biāo)定配置參數(shù)
找到camera_calibration/in_VID5.xml文件,這是標(biāo)定程序使用的配置文件,需要設(shè)置里面的幾個參數(shù)。

棋盤格的寬度和高度,寬度9 高度6。

<!-- Number of inner corners per a item row and column. (square, circle) -->
<BoardSize_Width>9</BoardSize_Width>
<BoardSize_Height>6</BoardSize_Height>

需要特別注意的是,這里的寬度和高度是指內(nèi)部交叉點的個數(shù),而不是方形格的個數(shù)。如下圖所示的棋盤格,內(nèi)部交叉點的寬度是9,高度是6。請務(wù)必填寫正確,否則無法標(biāo)定。


棋盤圖

每格的寬度
每格的寬度應(yīng)設(shè)置為實際的毫米數(shù),該參數(shù)的實際用途尚待考證。目前看來,即使設(shè)置的不準(zhǔn)確也無大礙。我使用默認(rèn)參數(shù)50。

  <!-- The size of a square in some user defined metric system (pixel, millimeter)-->
  <Square_Size>50</Square_Size>

選擇輸入方式
例程提供了三種輸入方式。不過,如果待標(biāo)定的攝像頭已經(jīng)接入電腦,建議使用input camera方式。該方式只需要設(shè)置視頻輸入設(shè)備號,對于筆記本電腦來說,通常0表示筆記本自帶攝像頭,1表示外接攝像頭。

  <!-- The input to use for calibration. 
        To use an input camera -> give the ID of the camera, like "1"
        To use an input video  -> give the path of the input video, like "/tmp/x.avi"
        To use an image list   -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
        -->
<Input>"1"</Input>

3、編譯
新建camera_calibration/CMakeLists.txt文件,寫入如下內(nèi)容。

project(Camera_Calibration)
set(CMAKE_CXX_STANDARD 11)

find_package(OpenCV 3.0 QUIET)
if(NOT OpenCV_FOUND)    
    find_package(OpenCV 2.4.3 QUIET)
    if(NOT OpenCV_FOUND)
        message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
    endif()
endif()

include_directories(${OpenCV_INCLUDE_DIR})
add_executable(Camera_Calibration camera_calibration.cpp)
target_link_libraries(Camera_Calibration ${OpenCV_LIBS})

編譯

mkdir build
cd build
cmake ..
make

4、運行
運行時需要傳入配置文件作為主函數(shù)的參數(shù):

./Camera_Calibration ../in_VID5.xml

程序啟動后會出現(xiàn)當(dāng)前攝像頭拍攝到的畫面,畫面里有操作提示。按下鍵盤'g'鍵開始標(biāo)定。請務(wù)必使攝像頭從不同方向拍攝棋盤格,以保證程序準(zhǔn)確計算圖像畸變。


標(biāo)定程序

共拍攝25張照片后自動結(jié)束標(biāo)定,標(biāo)定結(jié)果寫入camera_calibration/out_camera_data.xml。

這里有一些注意事項:

可以直接在另一臺電腦屏幕上顯示棋盤格,而不必打印出來。屏幕上顯示的棋盤格更平整,不會引入額外的誤差。
要在上下左右各個角度拍攝棋盤格,以減少各個圖片間的相關(guān)性,有利于求解相機參數(shù)和畸變系數(shù)。

5、修改成ORB-SLAM2工程可用的yaml文件
OK,我們先參考原來TUM數(shù)據(jù)集的yaml文件,目錄在/ORB-SLAM2/Examples/Monocular/TUM1.yaml
Copy一份作為自己攝像頭的參數(shù),命名為MyCam.yaml
我們根據(jù)out_camera_data.xml文件里的相機矩陣(camera_matrix),來填寫自己攝像頭的數(shù)據(jù)。(由于OpenCV標(biāo)定出來的文件,畸變參數(shù)好像和ORB-SLAM2使用的畸變參數(shù)略有不同,這里先不填,只填上相機矩陣的參數(shù)。)

  • out_camera_data.xml


    out_camera_data.xml
  • MyCam.yaml


    MyCam.yaml

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容