三維重建的opencv實(shí)現(xiàn)問題_第1頁(yè)
三維重建的opencv實(shí)現(xiàn)問題_第2頁(yè)
三維重建的opencv實(shí)現(xiàn)問題_第3頁(yè)
三維重建的opencv實(shí)現(xiàn)問題_第4頁(yè)
三維重建的opencv實(shí)現(xiàn)問題_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1.opencv2.1和opencv2.0在做stereo vision方面有什么區(qū)別了?2.1版增強(qiáng)了 Stereo Vision方面的功能:(1)新增了 SGBM 立體匹配算法(源自 HeikoHirschmuller 的Stereo Processing by Semi-global Matching and Mutual Information),可以獲得比 BM 算法物體 輪廓更清晰的視差圖(但低紋理區(qū)域容易出現(xiàn)橫/斜紋路,在GCstate-fullDP選 項(xiàng)使能時(shí)可消減這種異常紋路,但對(duì)應(yīng)區(qū)域視差變?yōu)?,且運(yùn)行速度會(huì)有所下降), 速度比BM稍慢,352*288的幀處理速度大約是5幀

2、/秒; 視差效果:BM SGBM SGBM GC ;BM算法比2.0版性能有所提升,其狀態(tài)參數(shù)新增了對(duì)左右視圖感興趣區(qū)域 ROI 的支持(roil 和 roi2,由 stereoRectify 函數(shù)產(chǎn)生);BM算法和GC算法的核心代碼改動(dòng)不大,主要是面向多線程運(yùn)算方面的(由 OpenMP 轉(zhuǎn)向 Intel TBB);cvFindStereoCorrespondenceBM 函數(shù)的 disparity 參數(shù)的數(shù)據(jù)格式新增了 CV_32F的支持,這種格式的數(shù)據(jù)給出實(shí)際視差,而2.0版只支持CV_16S, 需要除以16.0才能得到實(shí)際的視差數(shù)值。用于立體匹配的圖像可以是彩色的嗎?在OpenCV2.1

3、中,BM和GC算法只能對(duì)8位灰度圖像計(jì)算視差,SGBM算法則 可以處理24位(8bits*3)彩色圖像。所以在讀入圖像時(shí),應(yīng)該根據(jù)采用的算法 來處理圖像:intcolor_mode = alg = STEREO_SGBM ? 1 : 0;/載入圖像cvGrabFrame( lfCam );cvGrabFrame( riCam );frame1 = cvRetrieveFrame( lfCam );frame2 = cvRetrieveFrame( riCam );if(frame1.empty() break;resize(frame1, img1, img_size, 0, 0);resiz

4、e(frame2, img2, img_size, 0, 0);/選擇彩色或灰度格式作為雙目匹配的處理圖像if (!color_mode&cn1)cvtColor(img1, imglgray, CV_BGR2GRAY);cvtColor(img2, img2gray, CV_BGR2GRAY);img1p = img1gray;img2p = img2gray;elseimg1p = img1;img2p = img2;怎樣獲取與原圖像有效像素區(qū)域相同的視差圖?在OpenCV2.0及以前的版本中,所獲取的視差圖總是在左側(cè)和右側(cè)有明顯的黑 色區(qū)域,這些區(qū)域沒有有效的視差數(shù)據(jù)。視差圖有效像素區(qū)域

5、與視差窗口 (ndisp, 一般取正值且能被16整除)和最小視差值(mindisp, 一般取0或負(fù)值)相關(guān), 視差窗口越大,視差圖左側(cè)的黑色區(qū)域越大,最小視差值越小,視差圖右側(cè)的黑 色區(qū)域越大。其原因是為了保證參考圖像(一般是左視圖)的像素點(diǎn)能在目標(biāo)圖 像(右視圖)中按照設(shè)定的視差匹配窗口匹配對(duì)應(yīng)點(diǎn),OpenCV只從參考圖像的 第(ndisp - 1 + mindisp)列開始向右計(jì)算視差,第0列到第(ndisp - 1 + mindisp)列的區(qū)域視差統(tǒng)一設(shè)置為(mindisp - 1) *16;視差計(jì)算到第width + mindisp列時(shí)停止,余下的右側(cè)區(qū)域視差值也統(tǒng)一設(shè)置為(mindi

6、sp - 1) *16。00177 static constint DISPARITY_SHIFT = 4; 00411intndisp = state-numberOfDisparities;00412intmindisp = state-minDisparity;00413intlofs = MAX(ndisp - 1 + mindisp, 0);00414introfs = -MIN(ndisp - 1 + mindisp, 0);00415 int width = left-cols, height = left-rows;00416 int width1 = width - rofs

7、 - ndisp + 1; 00420 short FILTERED = (short)(mindisp - 1) DISPARITY_SHIFT); 00466/ initialize the left and right borders of the disparity map00467 for( y = 0; y height; y+ )0046800469for( x = 0; x lofs; x+ )00470dptry*dstep + x = FILTERED;00471for( x = lofs + width1; x width; x+ )00472dptry*dstep +

8、x = FILTERED;0047300474dptr += lofs;0047500476 for( x = 0; x 4);可以看到,原始視差在左移8位(256)并且加上一個(gè)修正值之后又右移了 4位, 最終的結(jié)果就是左移4位。因此,在實(shí)際求距離時(shí),cvReprojectTo3D出來的X/W,Y/W,Z/W都要乘以16 (也 就是W除以16),才能得到正確的三維坐標(biāo)信息?!痹贠penCV2.1中,BM算法可以用CV_16S或者CV_32F的方式輸出視差數(shù)據(jù), 使用32位float格式可以得到真實(shí)的視差值,而CV_16S格式得到的視差矩陣則 需要除以16才能得到正確的視差。另外,OpenCV2

9、.1另外兩種立體匹配算 法SGBM和GC只支持CV_16S格式的disparity矩陣。5.如何設(shè)置BM、SGBM和GC算法的狀態(tài)參數(shù)?StereoBMState/預(yù)處理濾波參數(shù)preFilterType:預(yù)處理濾波器的類型,主要是用于降低亮度失真(photometric distortions)、消除噪聲和增強(qiáng)紋理等,有兩種可選類型: CV_STEREO_BM_NORMALIZED_RESPONSE (歸一化響應(yīng))或者 CV_STEREO_BM_XSOBEL (水平方向Sobel算子,默認(rèn)類型),該參 數(shù)為int型;preFilterSize :預(yù)處理濾波器窗口大小,容許范圍是5,255,一

10、般應(yīng)該 在5x5.21x21之間,參數(shù)必須為奇數(shù)值,int型preFilterCap :預(yù)處理濾波器的截?cái)嘀?,預(yù)處理的輸出值僅保留-preFilterCap, preFilterCap范圍內(nèi)的值,參數(shù)范圍:1 - 31 (文檔中是31, 但代碼中是63) , int/ SAD參數(shù)SADWindowSize: SAD窗口大小,容許范圍是5,255, 一般應(yīng)該在5x5至 21x21之間,參數(shù)必須是奇數(shù),int型minDisparity:最小視差,默認(rèn)值為0,可以是負(fù)值,int型. numberOfDisparities:視差窗口,即最大視差值與最小視差值之差,窗口 大小必須是16的整數(shù)倍,int型

11、/后處理參數(shù). textureThreshold:低紋理區(qū)域的判斷閾值。如果當(dāng)前SAD窗口內(nèi)所有鄰 居像素點(diǎn)的x導(dǎo)數(shù)絕對(duì)值之和小于指定閾值,則該窗口對(duì)應(yīng)的像素點(diǎn)的視 差值為0(That is, if the sum of absolute values of x-derivatives computed over SADWindowSize by SADWindowSize pixel neighborhood is smaller than the parameter, no disparity is computed at the pixel),該參數(shù)不能為負(fù) 值,int型uniquene

12、ssRatio:視差唯一性百分比,視差窗口范圍內(nèi)最低代價(jià)是次低代 價(jià)的(1 + uniquenessRatio/100)倍時(shí),最低代價(jià)對(duì)應(yīng)的視差值才是該像素點(diǎn) 的視差,否則該像素點(diǎn)的視差為 0 (the minimum margin in percents between the best (minimum) cost function value and the second best value to accept the computed disparity, that is, accept the computed disparity dA only if SAD(d) = SAD(d

13、A) x (1 + uniquenessRatio/100.) for any d != d*+/-1 within the search range),該參數(shù)不能為負(fù)值,一般5-15左右的值比較合適, int型speckleWindowSize:檢查視差連通區(qū)域變化度的窗口大小,值為0時(shí)取 消speckle檢查,int型speckleRange:視差變化閾值,當(dāng)窗口內(nèi)視差變化大于閾值時(shí),該窗口內(nèi) 的視差清零,int型/ OpenCV2.1新增的狀態(tài)參數(shù)roi1, roi2:左右視圖的有效像素區(qū)域,一般由雙目校正階段的cvStereoRectify函數(shù)傳遞,也可以自行設(shè)定。一旦在狀態(tài)參數(shù)中設(shè)定

14、 了 roi1 和 roi2,OpenCV 會(huì)通過 cvGetValidDisparityROI 函數(shù)計(jì)算出視差 圖的有效區(qū)域,在有效區(qū)域外的視差值將被清零。disp12MaxDiff:左視差圖(直接計(jì)算得出)和右視差圖(通過 cvValidateDisparity計(jì)算得出)之間的最大容許差異。超過該閾值的視差 值將被清零。該參數(shù)默認(rèn)為-1,即不執(zhí)行左右視差檢查。int型。注意在 程序調(diào)試階段最好保持該值為-1,以便查看不同視差窗口生成的視差效 果。具體請(qǐng)參見使用OpenGL動(dòng)態(tài)顯示雙目視覺三維重構(gòu)效果示例一 文中的討論。在上述參數(shù)中,對(duì)視差生成效果影響較大的主要參數(shù)是SADWindowSiz

15、e、 numberOfDisparities和uniquenessRatio三個(gè),一般只需對(duì)這三個(gè)參數(shù)進(jìn)行調(diào)整, 其余參數(shù)按默認(rèn)設(shè)置即可。在OpenCV2.1中,BM算法有C和C+兩種實(shí)現(xiàn)模塊。StereoSGBMStateSGBM算法的狀態(tài)參數(shù)大部分與BM算法的一致,下面只解釋不同的部分:SADWindowSize: SAD窗口大小,容許范圍是1,11,一般應(yīng)該在3x3至 11x11之間,參數(shù)必須是奇數(shù),int型P1, P2:控制視差變化平滑性的參數(shù)。P1、P2的值越大,視差越平滑。P1是相鄰像素點(diǎn)視差增/減1時(shí)的懲罰系數(shù);P2是相鄰像素點(diǎn)視差變化 值大于1時(shí)的懲罰系數(shù)。P2必須大于P1。O

16、penCV2.1提供的例 程stereo_match.cpp給出了 P1和P2比較合適的數(shù)值。fullDP:布爾值,當(dāng)設(shè)置為TRUE時(shí),運(yùn)行雙通道動(dòng)態(tài)編程算法(full-scale 2-pass dynamic programming algorithm),會(huì)占用 O(W*H*numDisparities) 個(gè)字節(jié),對(duì)于高分辨率圖像將占用較大的內(nèi)存空間。一般設(shè)置為FALSE。注意OpenCV2.1的SGBM算法是用C+語言編寫的,沒有C實(shí)現(xiàn)模塊。與H. Hirschmuller提出的原算法相比,主要有如下變化:算法默認(rèn)運(yùn)行單通道DP算法,只用了 5個(gè)方向,而fullDP使能時(shí)則使用 8個(gè)方向(

17、可能需要占用大量?jī)?nèi)存)。算法在計(jì)算匹配代價(jià)函數(shù)時(shí),采用塊匹配方法而非像素匹配(不過 SADWindowSize=1時(shí)就等于像素匹配了)。匹配代價(jià)的計(jì)算采用 BT 算法(Depth Discontinuities by Pixel-to-Pixel Stereo by S. Birchfield and C. Tomasi),并沒有實(shí)現(xiàn)基于互熵信息的匹配 代價(jià)計(jì)算。增加了一些BM算法中的預(yù)處理和后處理程序。(3)StereoGCState GC算法的狀態(tài)參數(shù)只有兩個(gè):numberOfDisparities和maxIters,并且只能通 過cvCreateStereoGCState在創(chuàng)建算法狀態(tài)結(jié)

18、構(gòu)體時(shí)一次性確定,不能在循環(huán)中 更新狀態(tài)信息。GC算法并不是一種實(shí)時(shí)算法,但可以得到物體輪廓清晰準(zhǔn)確的 視差圖,適用于靜態(tài)環(huán)境物體的深度重構(gòu)。注意GC算法只能在C語言模式下運(yùn)行,并且不能對(duì)視差圖進(jìn)行預(yù)先的邊界延 拓,左右視圖和左右視差矩陣的大小必須一致。6.如何實(shí)現(xiàn)視差圖的偽彩色顯示?首先要將16位符號(hào)整形的視差矩陣轉(zhuǎn)換為8位無符號(hào)整形矩陣,然后按照一定 的變換關(guān)系進(jìn)行偽彩色處理。我的實(shí)現(xiàn)代碼如下:/轉(zhuǎn)換為CV_8U格式,彩色顯示dispLfcv = displf, dispRicv = dispri, disp8cv = disp8;if (alg = STEREO_GC)cvNormali

19、ze(&dispLfcv, &disp8cv, 0, 256, CV_MINMAX );elsedisplf.convertTo(disp8, CV_8U, 255/(m_nMaxDisp*16.);F_Gray2Color(&disp8cv, vdispRGB);灰度圖轉(zhuǎn)偽彩色圖的代碼,主要功能是使灰度圖中亮度越高的像素點(diǎn),在偽彩色 圖中對(duì)應(yīng)的點(diǎn)越趨向于紅色;亮度越低,則對(duì)應(yīng)的偽彩色越趨向于藍(lán)色;總體上 按照灰度值高低,由紅漸變至藍(lán),中間色為綠色。其對(duì)應(yīng)關(guān)系如下圖所示:圖20void F_Gray2Color(CvMat* gray_mat, CvMat* color_mat)if(colo

20、r_mat)cvZero(color_mat);intstype = CV_MAT_TYPE(gray_mat-type), dtype =CV_MAT_TYPE(color_mat-type);int rows = gray_mat-rows, cols = gray_mat-cols;/判斷輸入的灰度圖和輸出的偽彩色圖是否大小相同、格式是否符合要 求if (CV_ARE_SIZES_EQ(gray_mat, color_mat) &stype = CV_8UC1&dtype = CV_8UC3)CvMat* red = cvCreateMat(gray_mat-rows, gray_mat

21、-cols, CV_8U);CvMat* green = cvCreateMat(gray_mat-rows, gray_mat-cols,CV_8U);CvMat* blue = cvCreateMat(gray_mat-rows, gray_mat-cols,CV_8U);CvMat* mask = cvCreateMat(gray_mat-rows, gray_mat-cols, CV_8U);計(jì)算各彩色通道的像素值cvSubRS(gray_mat, cvScalar(255), blue); / blue(I) = 255 -gray (I)cvCopy(gray_mat, red);

22、/ red(I) = gray(I)cvCopy(gray_mat, green);/ green(I)=gray(I),if gray(I) = 128cvSubRS(green, cvScalar(255), green, mask);cvConvertScale(green, green, 2.0, 0.0);/合成偽彩色圖cvMerge(blue, green, red, NULL, color_mat);cvReleaseMat(&red );cvReleaseMat(&green );cvReleaseMat(&blue );cvReleaseMat(&mask );7.如何將視差數(shù)據(jù)保存為txt數(shù)據(jù)文件以便在Matlab中讀取分析?由于OpenCV本身只支持xml、yml的數(shù)據(jù)文件讀寫功能,并且其xml文件與構(gòu) 建網(wǎng)頁(yè)數(shù)據(jù)所用的xml文件格式不一致,在Matlab中無法讀取。我們可以通過 以下方式將視差數(shù)據(jù)保存為txt文件,再導(dǎo)入到Matlab中。voidsaveD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論