最近整理了一下這兩年一直在用的攝像機定標與立體匹配測試程序,將代碼進行了重構,界面也做了調整,分享出來方便有需要的朋友使用。當然我的編程能力有限,程序可能還有各種bug,請大家多多包涵。相關問題歡迎留言或email聯繫討論,謝謝!
==================================================================================
源碼下載:
Github: https://github.com/yuhuazou/StereoVision (2014-05-05 更新,新增StereoVar算法)
微盤: http://vdisk.weibo.com/s/sEby0 (已修正只能打開一個攝像頭的bug)
CSDN資源:http://download.csdn.net/detail/chenyusiyuan/4702621 (有bug,只能打開一個攝像頭)
==================================================================================
bug#01:
{
//打開第一個攝像頭
...
一、原始編譯環境
Ÿ Windows 7 64位旗艦版
Ÿ OpenCV SVN(v2.4.9)
Ÿ x64應用
二、編譯修改說明(下載後必須按以下步驟根據你的本機環境調整設置,才能正常編譯使用)
1. 雙擊 .sln文件打開解決方案
2. 在項目屬性的“VC++目錄”中分別修改OpenCV相關的 include路徑和 lib路徑;directshow的路徑使用了相對路徑,不需要修改
3. 在“解決方案平臺”中選擇“win32”或“x64”,分別對應32位系統和64位系統
三、使用說明
1. 界面
紅色:攝像頭初始化區域; 綠色:圖像基本處理區域;
藍色:攝像頭定標區域; 橙色:雙目匹配計算區域;
2. 操作步驟
(1) 攝像頭初始化
1) 選擇擬打開的攝像頭:
當電腦接入多個攝像頭時:A.從“選擇左/右攝像頭”下拉菜單中選擇該視角應該對應的攝像頭設備名稱(序號);B. 注意不同視角的攝像頭設備序號不能相同,若相同會彈出警告窗口。
當電腦只有一個攝像頭接入時:直接從“選擇左攝像頭”下拉菜單中選擇攝像頭設備名稱(序號)。
2) 選擇攝像頭的分辨率:
從“選擇分辨率”下拉菜單中選擇,目前有三種分辨率:640*480、352*288、320*240.
3) 啓動攝像頭:
點擊“啓動攝像頭”按鈕,界面上各功能按鈕生效,即可進行攝像頭定標、雙目匹配等操作。
點擊“關閉攝像頭”按鈕,可以重新調整攝像頭的配置。
(2) 攝像機定標
1) 點擊“默認設置”,加載默認參數和選項;
2) 按照實際需要調整相關參數和選項;
A. 棋盤角點數:nx和ny分別是棋盤上橫向和縱向的角點個數,注意必須按照實際棋盤橫向和縱向的最大角點數輸入,否則會造成角點檢測失敗;
B. 棋盤方塊大小:棋盤方塊的實際大小,毫米爲單位;
C. 棋盤檢測次數:以10-20次爲宜;
D. 雙目校正縮放係數:取值範圍爲0至1,或者 -1。具體含義參見:http://blog.csdn.net/chenyusiyuan/article/details/8131496
E. 棋盤圖像來源:默認爲“從攝像機”,也可選擇“從本地圖片”;若選擇“從本地圖片”讀入,在執行定標時,將彈出對話框分別選擇左視圖圖像和右視圖圖像;注意左、右視圖的圖像數均需要至少4張;當左、右視圖圖像數與棋盤檢測次數不一致時,取三者最小值爲準;
F. 雙目校正算法:默認爲“BOUGUET”,也可選擇“HARTLEY”;不過“HARTLEY”方法的雙目校正尚未進行測試,可能存在bug;
G. 標誌位選擇:各標誌位的設置請參見OpenCV相關文檔;
FPP: CV_CALIB_FIX_PRINCIPAL_POINT
UIG: CV_CALIB_USE_INTRINSIC_GUESS
FAR: CV_CALIB_FIX_ASPECT_RATIO
ZTD: CV_CALIB_ZERO_TANGENT_DIST
SFL: CV_CALIB_SAME_FOCAL_LENGTH
FI: CV_CALIB_FIX_INTRINSIC
H. 讀入角點座標數據:如果曾進行過攝像機定標操作,程序文件夾內將保存有上一次操作的棋盤角點數據的文件(文件名爲CornerData.yml)。點擊該選項,將自動加載上一次操作的棋盤角點數據,跳過“棋盤角點檢測”這一步,直接進行攝像機定標。如果文件夾內沒有CornerData.yml文件或者文件讀取失敗,將彈出警告窗口,應檢查該文件是否存在、或者不選擇此項,重新進行棋盤角點檢測;
I. 讀入單目定標結果:將從本地文件(cameraParams_left.yml和cameraParams_right.yml)中加載攝像機參數,然後進行攝像機定標;如果加載失敗,將彈出警告窗口;
J. 首先執行單目定標:在獲取棋盤角點數據後,先調用cv::calibrate- Camera函數對左、右攝像機分別進行定標,獲取攝像機內部參數,並將參數保存到 cameraParams_left/right.yml文件中。然後再執行雙目定標(當電腦接入的攝像頭數大於1個時);
K. 直接執行雙目定標:在獲取棋盤角點數據後,直接調用stereoCalibrate函數進行雙目定標(當電腦接入的攝像頭數大於1個時);定標結果保存到calib_paras.xml文件中。
注意:H、I、J項是三選一的選項。
L. 顯示攝像機定標效果:如果僅接入一個攝像頭,則顯示單目定標後消除畸變的效果;否則顯示雙目定標後左右視圖畸變消除和行對準的效果。
3) 點擊“執行攝像機定標”,開始定標操作,程序將依次執行以下工作:
A. 棋盤角點檢測
B. 單目定標
C. 雙目定標
D. 雙目校正
E. 顯示定標效果
4) 點擊“退出攝像機定標”,完成或中止定標操作,恢復攝像機正常顯示。該按鈕僅在“棋盤角點檢測”和“顯示定標效果”階段有效。
(3) 雙目匹配
1) 選擇“雙目匹配算法”:“BM”或“SGBM”,點擊後將清零相關的參數;
2) 點擊“默認配置”:載入所選算法的默認參數;
3) 視需要調整參數,可以在計算視差期間實時調整各項參數;
A. “參數設置”中各項參數的意義和取值請參見OpenCV相關文檔;
B. 選擇圖像來源:“從攝像機”或“從本地圖片”;
C. “雙目校正”:點選後,將需要手動選擇攝像機定標文件,然後程序將根據定標參數對圖像進行校正,再進行雙目匹配和視差計算。若不點選,則程序直接對原始的左右視圖進行視差計算,這種情況一般用於從本地讀取下載好的公共測試圖像,這些公共測試圖像一般都已經過標定和行對齊,可直接用於視差計算;
D. “三維點雲”:點選後,將根據視差圖生成三維點雲,並檢測距離最近的物體;但若讀入的攝像機定標文件中記錄的校正方法不是 BOUGUET 方法,則無法生成點雲;
E. “保存畫面”:點選後,將自動保存每幀左、右視圖和視差圖到本地;
F. “延時處理”:點選後,將在計算完每幀視圖的視差圖和三維點雲後,延時一定時間,再進入下一幀的處理;延時時間默認爲 5 秒;可自行調整;
G. “切換視圖”:在“視差圖”窗口中顯示 彩色視差、灰度視差、環境俯視、環境側視 圖像;
H. “視場範圍”:設置視場的寬度、高度和深度範圍。
4) 點擊“計算視差”,將執行如下操作:
A. 若選擇“從本地圖片”載入左右視圖,則將彈出對話框分別選擇左右視圖圖像,可單選或多選;
B. 若點選了“雙目校正”,將彈出對話框,由用戶選擇雙目攝像機標定參數文件(文件名一般爲calib_paras.xml),程序將分析相關參數;
C. 程序進入循環,自動從本地或攝像機加載圖像,進行雙目匹配和視差計算等。
D. 如果點選了“生成點雲”,程序將根據視差圖生成三維點雲,並檢測出距離最近的物體,在界面中顯示物體的相關信息。
5) 點擊“停止計算”,退出雙目匹配和視差計算操作,恢復攝像機正常顯示。
(4) 幀處理測試
此處可進行各種簡單的圖像處理操作,目前有canny邊緣檢測、直方圖平衡、顏色空間轉換等。
四、其它
1、α=1的雙目校正
2、 α=0的雙目校正
3、α=-1的雙目校正
==================================================================================