1. 程式人生 > >基於MFC和OpenCV的攝像機定標與立體匹配測試程式

基於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)
{
//開啟第一個攝像頭
...
上面的m_nCamCount == 1 就是 bug,需要改為m_nCamCount >= 1 這樣應該就能同時開啟兩個攝像頭了。
==========================================================

 

一、原始編譯環境

Ÿ  Windows 7 64位旗艦版

Ÿ  OpenCV SVNv2.4.9

Ÿ  x64應用


二、編譯修改說明(下載後必須按以下步驟根據你的本機環境調整設定,才能正常編譯使用)

1.      雙擊 .sln檔案開啟解決方案

2.      在專案屬性的VC++目錄”中分別修改OpenCV相關的 include路徑和 lib路徑;directshow的路徑使用了相對路徑,不需要修改

3.      在“解決方案平臺”中選擇“win32”或“x64”,分別對應32位系統和64位系統



三、使用說明

1.      介面


紅色:攝像頭初始化區域;          綠色:影象基本處理區域;

藍色:攝像頭定標區域;              橙色:雙目匹配計算區域;

 

2.       操作步驟

(1)     攝像頭初始化

1)         選擇擬開啟的攝像頭:

   當電腦接入多個攝像頭時:A.從“選擇左/右攝像頭”下拉選單中選擇該視角應該對應的攝像頭裝置名稱(序號);B. 注意不同視角的攝像頭裝置序號不能相同,若相同會彈出警告視窗。

   當電腦只有一個攝像頭接入時:直接從“選擇左攝像頭”下拉選單中選擇攝像頭裝置名稱(序號)。

2)         選擇攝像頭的解析度:

   從“選擇解析度”下拉選單中選擇,目前有三種解析度:640*480352*288320*240.

3)         啟動攝像頭:

   點選“啟動攝像頭”按鈕,介面上各功能按鈕生效,即可進行攝像頭定標、雙目匹配等操作。

   點選“關閉攝像頭”按鈕,可以重新調整攝像頭的配置。

(2)     攝像機定標

1)         點選“預設設定”,載入預設引數和選項;

2)         按照實際需要調整相關引數和選項;

A.        棋盤角點數:nxny分別是棋盤上橫向和縱向的角點個數,注意必須按照實際棋盤橫向和縱向的最大角點數輸入,否則會造成角點檢測失敗;

B.        棋盤方塊大小:棋盤方塊的實際大小,毫米為單位;

C.        棋盤檢測次數:以10-20次為宜;

D.        雙目校正縮放係數:取值範圍為01,或者 -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.ymlcameraParams_right.yml)中載入攝像機引數,然後進行攝像機定標;如果載入失敗,將彈出警告視窗;

J.          首先執行單目定標:在獲取棋盤角點資料後,先呼叫cv::calibrate- Camera函式對左、右攝像機分別進行定標,獲取攝像機內部引數,並將引數儲存到 cameraParams_left/right.yml檔案中。然後再執行雙目定標(當電腦接入的攝像頭數大於1個時);

K.         直接執行雙目定標:在獲取棋盤角點資料後,直接呼叫stereoCalibrate函式進行雙目定標(當電腦接入的攝像頭數大於1個時);定標結果儲存到calib_paras.xml檔案中。

注意:HIJ項是三選一的選項。

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 SVNv2.4.9

Ÿ  x64應用


二、編譯修改說明(下載後必須按以下步驟根據你的本機環境調整設定,才能正常編譯使用)

1.      雙擊 .sln檔案開啟解決方案

2.      在專案屬性的VC++目錄”中分別修改OpenCV相關的 include路徑和 lib路徑;directshow的路徑使用了相對路徑,不需要修改

3.      在“解決方案平臺”中選擇“win32”或“x64”,分別對應32位系統和64位系統



三、使用說明

1.      介面


紅色:攝像頭初始化區域;          綠色:影象基本處理區域;

藍色:攝像頭定標區域;              橙色:雙目匹配計算區域;

 

2.       操作步驟

(1)     攝像頭初始化

1)         選擇擬開啟的攝像頭:

   當電腦接入多個攝像頭時:A.從“選擇左/右攝像頭”下拉選單中選擇該視角應該對應的攝像頭裝置名稱(序號);B. 注意不同視角的攝像頭裝置序號不能相同,若相同會彈出警告視窗。

   當電腦只有一個攝像頭接入時:直接從“選擇左攝像頭”下拉選單中選擇攝像頭裝置名稱(序號)。

2)         選擇攝像頭的解析度:

   從“選擇解析度”下拉選單中選擇,目前有三種解析度:640*480352*288320*240.

3)         啟動攝像頭:

   點選“啟動攝像頭”按鈕,介面上各功能按鈕生效,即可進行攝像頭定標、雙目匹配等操作。

   點選“關閉攝像頭”按鈕,可以重新調整攝像頭的配置。

(2)     攝像機定標

1)         點選“預設設定”,載入預設引數和選項;

2)         按照實際需要調整相關引數和選項;

A.        棋盤角點數:nxny分別是棋盤上橫向和縱向的角點個數,注意必須按照實際棋盤橫向和縱向的最大角點數輸入,否則會造成角點檢測失敗;

B.        棋盤方塊大小:棋盤方塊的實際大小,毫米為單位;

C.        棋盤檢測次數:以10-20次為宜;

D.        雙目校正縮放係數:取值範圍為01,或者 -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.ymlcameraParams_right.yml)中載入攝像機引數,然後進行攝像機定標;如果載入失敗,將彈出警告視窗;

J.          首先執行單目定標:在獲取棋盤角點資料後,先呼叫cv::calibrate- Camera函式對左、右攝像機分別進行定標,獲取攝像機內部引數,並將引數儲存到 cameraParams_left/right.yml檔案中。然後再執行雙目定標(當電腦接入的攝像頭數大於1個時);

K.         直接執行雙目定標:在獲取棋盤角點資料後,直接呼叫stereoCalibrate函式進行雙目定標(當電腦接入的攝像頭數大於1個時);定標結果儲存到calib_paras.xml檔案中。

注意:HIJ項是三選一的選項。

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的雙目校正

==================================================================================