http://blog.csdn.net/chenyusiyuan/article/details/5072597
學習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>