OpenCV學習筆記(11)OpenCV+MFC的雙目視覺測距與景深實現 之 問題探討

OpenCV學習筆記(11)OpenCV+MFC的雙目視覺測距與景深實現 之 問題探討

學習OpenCV快3個月了,主要是根據課題需要實現雙目視覺測距、景深重建和目標(障礙物)檢測。目前已經能實現攝像頭定標和校正、雙目匹配、獲取視差圖和環境景深圖像,但是在測距方面還沒有精確實現,主要是還沒徹底弄清楚攝像頭定標,有幾個問題希望能和大家探討下:

1、進行攝像頭定標時,棋盤方格的實際大小 square_size (默認為 1.0f )的設置對定標參數是否有影響? 具體地,假如棋盤方格大小的 3 cm,那麼 square_size 就應該設置為 30.0f 吧? 另外,定標所得的攝像頭內參數,即焦距和原點坐標,其數值單位都是一致的嗎? 怎麼把焦距數值換算為實際的物理量? 2、在使用 cvStereoCalibrate 進行雙攝像頭定標時,flags 的設置怎樣才是最優? 我目前的設置是 CV_CALIB_FIX_ASPECT_RATIO + CV_CALIB_FIX_PRINCIPAL_POINT + CV_CALIB_SAME_FOCAL_LENGTH 同樣地,怎麼把定標得到的兩個攝像頭之間的平移矩陣參數 Transaction_matrix 轉換為實際的物理量?其中的 Tx 值應該是兩個攝像頭成像原點之間的距離,根據公式 Z = f*Tx/(d-(Cxl-Cxr)) 來測算目標距離。 3、關於 cvStereoRectify 函數 在雙目校正(Stereo Rectification)上,我目前使用的是 BOUGUET 方法,即 cvStereoRectify 函數,因為要獲取景深圖像,所以 cvStereoRectify 函數要輸出一個變換矩陣 Q,並且最後的參數 flag 我設置為0,而不是 CV_CALIB_ZERO_DISPARITY。這樣設置應該沒問題吧?

(1)校正後得到的變換矩陣Q,Q[0][3]、Q[1][3]存儲的是校正後左攝像頭的原點坐標(principal point)cx和cy,Q[2][3]是焦距,Learning OpenCV 書中說是「Here the parameters are from the left image」,但為什麼與 cvStereoCalibrate 得到的左攝像頭內參數據不同呢? (2)如上圖公式所示,按照 Learning OpenCV P435給出的 Q 矩陣,計算距離 Z 的公式是帶負號的,但這與 P436 給出的對應公式剛好是反號了的! 4、關於雙目匹配求取視差圖 OpenCV提供了兩個函數來進行雙目匹配、獲取視差:cvFindStereoCorrespondenceBM 和 cvFindStereoCorrespondenceGC。 BM 的執行速度快,我用30幀/秒的速度讀入352*288的攝像頭畫面,用 BM 方法不會卡,算是實時了,但 BM 方法得到的視差不精確,所得的視差圖只是大致上與實物輪廓相似;而GC 方法則能得到非常好的視差圖,但是速度極慢,大概4、5秒才能處理完一幀畫面。 我的 BMState 是這樣設置的:

// 創建 CvStereoBMState 類的一個實例 BMState,進行雙目匹配 BMState = cvCreateStereoBMState(); assert(BMState != 0); BMState->preFilterSize=13; BMState->preFilterCap=13; BMState->SADWindowSize=13; BMState->minDisparity=-16; BMState->numberOfDisparities=64; BMState->textureThreshold=10; BMState->uniquenessRatio=15;

視差矩陣是 CV_16S 數據類型。目前的問題是,所得的視差數值範圍是從 -272 到 800 左右,不明白是怎麼算出來的。原理上,對於左視圖的一個特徵點,應該是從右視圖對應的同一行像素點上,在設定的 numberOfDisparities 和 minDisparity 範圍內,尋找匹配的特徵點、並求出視差值,這樣的話,視差數據的數值範圍應該是在[minDisparity, numberOfDisparities]內的(例如這裡應該是[-16, 64]範圍)。

下面是攝像頭定標所得的參數,有興趣的朋友麻煩幫忙看看、分析一下 O(∩_∩)O~

xml version="1.0"?><opencv_storage><num_frames>40num_frames><image_size> 352 288image_size><lfCamMat_tM_1 type_id="opencv-matrix"> <rows>3rows> <cols>3cols> <dt>ddt> <data> 466.1152304250040900 0. 175.5000000000000000 0. 466.1152304250040900 143.5000000000000000 0. 0. 1.data>lfCamMat_tM_1><riCamMat_tM_2 type_id="opencv-matrix"> <rows>3rows> <cols>3cols> <dt>ddt> <data> 466.1152304250040900 0. 175.5000000000000000 0. 466.1152304250040900 143.5000000000000000 0. 0. 1.data>riCamMat_tM_2><lfDistCoef_tD_1 type_id="opencv-matrix"> <rows>1rows> <cols>5cols> <dt>ddt> <data> -0.2573650855216149 -1.8434093222735448 -3.0112808382708931e-003 -6.4644827216197836e-003 6.8034878625006252data>lfDistCoef_tD_1><riDistCoef_tD_2 type_id="opencv-matrix"> <rows>1rows> <cols>5cols> <dt>ddt> <data> -0.2243951326136464 0.3568495067121301 0.0165299920785396 -0.0150102576251246 -11.3185299056116850data>riDistCoef_tD_2><Rotation_matrix type_id="opencv-matrix"> <rows>3rows> <cols>3cols> <dt>ddt> <data> 0.9995520693887151 1.2173722340566046e-003 0.0299028190239849 -9.9571078893194204e-004 0.9999719274362870 -7.4264998069014671e-003 -0.0299110203898538 7.3933986907815975e-003 0.9995252215502303data>Rotation_matrix><Transaction_matrix type_id="opencv-matrix"> <rows>3rows> <cols>1cols> <dt>ddt> <data> -62.4046095533341470 2.2541399055670328 4.0660224235033873data>Transaction_matrix><Foundation_matrix type_id="opencv-matrix"> <rows>3rows> <cols>3cols> <dt>ddt> <data> -1.8956412948785254e-006 -1.2111883584794274e-004 0.0495469807761968 6.5733933919231557e-005 1.3948680821461410e-005 0.8578014591819361 -0.0396473926165904 -0.8508164298132787 1.data>Foundation_matrix><Rectif_LfCamMat type_id="opencv-matrix"> <rows>3rows> <cols>4cols> <dt>ddt> <data> 437.5624983240625700 0. 191.6575660705566400 0. 0. 437.5624983240625700 145.4007148742675800 0. 0. 0. 1. 0.data>Calib_LfCamMat><Rectif_RiCamMat type_id="opencv-matrix"> <rows>3rows> <cols>4cols> <dt>ddt> <data> 437.5624983240625700 0. 205.8338241577148400 -2.7329986601713106e+004 0. 437.5624983240625700 145.4007148742675800 0. 0. 0. 1. 0.data>Calib_RiCamMat><Q_matrix type_id="opencv-matrix"> <rows>4rows> <cols>4cols> <dt>ddt> <data> 1. 0. 0. -191.6575660705566400 0. 1. 0. -145.4007148742675800 0. 0. 0. 437.5624983240625700 0. 0. -0.0160103444140231 0.2269667744774826data>Q_matrix>opencv_storage>

推薦閱讀:

反思與重構:如何實現行政處罰和刑事處罰的銜接
比較常見容易實現的醒酒食物
斯賓諾莎實現幸福的秘訣
活法-第一章《實現理想》
從事展現天賦的工作,實現個人的豐盛、喜悅和富足。

TAG:學習 | 視覺 | 測距 | 筆記 | OpenCV | 景深 | 探討 | 問題 | 實現 |