OpenCV例程_stereo_calib.cpp解析


stereo_calib是OpenCV官方代碼中提供的最正統的雙目demo,無論數據集還是代碼都有很好實現。

一、代碼效果:
相關的內容包括28張圖片,1個xml和stereo_calib.cpp的代碼
直接引入的代碼不能給正常運行,我們需要進行一些修改。
報了4個錯誤,主要是定義和引入問題,都可以解決。
包括定義:
#define  INTER_LINEAR_EXACT 1
以及
主要目的,就是確保輸入的參數正確,圖片能夠被讀到。
由於原始代碼很貼心地將參數都設置正確了(可以參考下圖,長為9、寬為6),所以可以放心實用。
但是,目前代碼還是無法完全運行,其原因是因為在以上代碼中,調用了.xml,我們看看它是什么樣子的:
這是一個序列化的文件,保存的是我們需要處理的圖片的位置。這里都是相對地址,而我們的圖片要么和當前運行的程序放到一個目錄下面;要么修改代碼;或者,修改這個配置xml文件,將其全部改成絕對地址。
大概是這個樣子,當然你放的位置不一樣,這里的xml肯定不一樣;或者你認為這種方法比較麻煩,采用其他的方法也沒有問題。
確保標定的圖片能夠正確地讀入進去。
成功的話,經過較長時間暈死,就會繪制這樣的結果圖片。按下鍵盤任意按鍵,就會切換下一幀。
如果我們自己有采集的圖片,進行替換后可以用在這里。
二、代碼解析
在能正確運行的基礎上,我們來分析這段代碼是如何產生作用的。
1)main函數
main函數是整個程序的入口,一般從這個函數開始分析。
這個例程的main函數非常簡單,藍色框圖部分,都是對輸入參數進行准備;而在綠色部分,是程序本體。
2)StereoCalib
StereoCalib(const vector<string>& imagelist,
 Size boardSize
 float squareSize,
 bool displayCorners = false,
 bool useCalibrated=true,
 bool showRectified=true)
第一個參數是輸入的圖片序列,我們只要將圖片地址輸入即可;在前面的設定下,這個參數為:
第二個參數是標定板的尺寸;
至於為什么是9*6,之前已經說明了;
后面4個參數都是和顯示相關的,保持不變即可。如果你感興趣,可以變換看效果,最好先看這些參數的英文名稱。
這個函數很長,我們揀重要的來講:
從這個嵌套循環開始,程序進入主體。由於我們做的是一個左右對比的程序,所以一個二維的循環肯定是必須的。
值得注意的是,這里的二維循環並非先循環左邊的圖片,對應右邊的圖片,而是采取了另一種方式。
綠色框圖部分,比較輸入的圖片是否為同樣大小。這里不考慮非同樣大小的情況。
在這個循環中,最核心也是最消耗時間的就是findchessboardcorners函數,它的目的是分析當前圖像,找到棋盤圖片的角點。
最后,對於識別效果比較好的情況,全部推入goodImageList中去。對於官方提供的例子,13對圖像全部為gooImageList,我們也可以根據這里入選的情況,判斷當前采集圖像的質量。
這里,OpenCV代碼提供了一個很好的技巧,用於處理當前圖像由於縮放可能帶來的問題:
 
默認情況下是在原始大小下進行尋找,如果沒有找到,則放大一次尋找,一旦找到,直接跳出循環。
根據得到角點結果,計算相機參數矩陣。正如我們知道的一樣,是3*3矩陣。
調用stereoCalibrate函數,這個函數參數好多呀。
這段是采用擬合的方法,計算誤差。
這里是將標定的結果,序列化地保存下來。
三、如何應用
這個函數很長,卻代表了標定的完整過程。在使用的過程中,肯定還是要將其分解成各個函數,而后再單獨地進行處理。
標定應該只是一個過程,標定成功后的結果可以反復使用,所以這個操作消耗一些時間應該也是沒有問題的。
 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM