1. 程式人生 > >【雙目備課】OpenCV例程_stereo_calib.cpp解析

【雙目備課】OpenCV例程_stereo_calib.cpp解析

cpp family odi 尺寸 棋盤 耗時 char 設置 play

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)StereoCalibStereoCalib(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函數,這個函數參數好多呀。技術分享圖片這段是采用擬合的方法,計算誤差。技術分享圖片這裏是將標定的結果,序列化地保存下來。三、如何應用這個函數很長,卻代表了標定的完整過程。在使用的過程中,肯定還是要將其分解成各個函數,而後再單獨地進行處理。標定應該只是一個過程,標定成功後的結果可以反復使用,所以這個操作消耗一些時間應該也是沒有問題的。


來自為知筆記(Wiz)

【雙目備課】OpenCV例程_stereo_calib.cpp解析