基於MFC和OpenCV的攝像機定標與立體匹配測試程式
最近整理了一下這兩年一直在用的攝像機定標與立體匹配測試程式,將程式碼進行了重構,介面也做了調整,分享出來方便有需要的朋友使用。當然我的程式設計能力有限,程式可能還有各種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:
在 StereoVisionDlg.cpp 檔案的 OnBnClkRunCam() 函式裡, ... if (m_nCamCount == 1){
//開啟第一個攝像頭
...
==========================================================
一、原始編譯環境
Ÿ 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的雙目校正
==================================================================================
最近整理了一下這兩年一直在用的攝像機定標與立體匹配測試程式,將程式碼進行了重構,介面也做了調整,分享出來方便有需要的朋友使用。當然我的程式設計能力有限,程式可能還有各種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:
在 StereoVisionDlg.cpp 檔案的 OnBnClkRunCam() 函式裡, ... if (m_nCamCount == 1){
//開啟第一個攝像頭
... 上面的m_nCamCount == 1 就是 bug,需要改為m_nCamCount >= 1 這樣應該就能同時開啟兩個攝像頭了。
==========================================================
一、原始編譯環境
Ÿ 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的雙目校正
==================================================================================