OpenCV攝像頭標(biāo)定(待修改)

OpenCV攝像頭標(biāo)定

轉(zhuǎn)自 http://www.itdecent.cn/p/9a4d9f9dfedc

本文介紹使用OpenCV自帶的標(biāo)定例程對單目攝像頭標(biāo)定的過程。

操作系統(tǒng):Linux

OpenCV版本:3.2.0

攝像頭:640×480像素,90度廣角鏡頭

一、標(biāo)定步驟

1、找到標(biāo)定例程

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

2、修改標(biāo)定配置參數(shù)

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

棋盤格的寬度和高度。

96

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

每格的寬度

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

20

選擇輸入方式

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


? ? ? ? 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"

? ? ? ? -->"1"

3、編譯

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

project(Camera_Calibration)set(CMAKE_CXX_STANDARD11)find_package(OpenCV3.0QUIET)if(NOT OpenCV_FOUND)find_package(OpenCV2.4.3QUIET)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})

編譯

wjg@wjg-PC:camera_calibration/build$ cmake ..

wjg@wjg-PC:camera_calibration/build$ make

4、運(yùn)行

運(yùn)行時需要傳入配置文件:

wjg@wjg-PC:camera_calibration/build$ Camera_Calibration ../in_VID5.xml

程序啟動后會出現(xiàn)當(dāng)前攝像頭拍攝到的畫面,右下角有操作提示。按下鍵盤'q'鍵開始標(biāo)定。請務(wù)必使攝像頭從不同方向拍攝棋盤格,以保證程序準(zhǔn)確計算圖像畸變。共拍攝25張照片后自動結(jié)束標(biāo)定,標(biāo)定結(jié)果寫入camera_calibration/out_camera_data.xml。此時,為了查看標(biāo)定效果,可以按下鍵盤'u'鍵,畫面將切換到去畸變后的圖像,如果畸變完全消除,則標(biāo)定成功,否則應(yīng)該重新標(biāo)定。

這里有一些注意事項:

可以直接在另一臺電腦屏幕上顯示棋盤格,而不必打印出來。屏幕上顯示的棋盤格更平整,不會引入額外的誤差。

要在上下左右各個角度拍攝棋盤格,以減少各個圖片間的相關(guān)性,有利于求解相機(jī)參數(shù)和畸變系數(shù)。

現(xiàn)在,就可以使用標(biāo)定好的相機(jī)內(nèi)參和畸變系數(shù)啦!

二、相機(jī)去畸變

有了標(biāo)定好的參數(shù),如何把輸入圖片的畸變?nèi)コ兀科鋵?shí)很簡單,只需要調(diào)用OpenCV提供的一個函數(shù)就可以了:

cv::undistort(temp, frame, mK, mDistCoef);

其中,temp為原圖片,frame為去畸變后的圖片,mK為相機(jī)內(nèi)參數(shù)矩陣,mDistCoef為畸變矩陣。后兩個矩陣都可以在camera_calibration/out_camera_data.xml中找到。

三、理論知識——相機(jī)模型

光會用還不夠,我們應(yīng)該至少了解為什么需要標(biāo)定,標(biāo)定有什么用。

簡單來說,標(biāo)定是為了能夠從空間點(diǎn)的像素坐標(biāo)映射到世界坐標(biāo),這是3D立體視覺必須經(jīng)過的過程。這一過程需要三步,第一步從畸變的像素坐標(biāo)映射到去畸變的像素坐標(biāo),需要用到畸變矩陣mDistCoef;第二步從去畸變的像素坐標(biāo)映射到相機(jī)坐標(biāo),需要用到相機(jī)內(nèi)參數(shù)矩陣mK;第三步從相機(jī)坐標(biāo)映射到世界坐標(biāo),需要用到相機(jī)外參數(shù)矩陣,也就是相機(jī)位姿變換矩陣。下圖展示了第二步和第三步的過程。

關(guān)于更詳細(xì)的理論知識,推薦閱讀文末列出的參考資料。

四、參考資料

《視覺SLAM十四講》第5講 相機(jī)與圖像?高翔

機(jī)器視覺的相機(jī)標(biāo)定到底是什么??知乎

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

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

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