基于cv的雙目測(cè)距系統(tǒng)階段性總結(jié)筆記_第1頁
基于cv的雙目測(cè)距系統(tǒng)階段性總結(jié)筆記_第2頁
基于cv的雙目測(cè)距系統(tǒng)階段性總結(jié)筆記_第3頁
基于cv的雙目測(cè)距系統(tǒng)階段性總結(jié)筆記_第4頁
基于cv的雙目測(cè)距系統(tǒng)階段性總結(jié)筆記_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

EmguCV&OpenCV前言在這個(gè)文檔中,我將把我這一段時(shí)間以來的所有的學(xué)習(xí)心得和對(duì)OpenCVEmguCV的理解,對(duì)”O(jiān)penCV的雙目測(cè)距系統(tǒng)”這個(gè)一.OpenCV為基礎(chǔ)的程序(以下稱原程序)calib.h定義了calib類和傳遞參數(shù)使用的結(jié)構(gòu)CvvImage.hOpenCVhighgui.h中定義的CvvImage類可以很好的實(shí)現(xiàn)OpenCV和WindowsMFC顯示接口,然而在OpenCV2.2之后,不再提供該類的定義,故此處給出其定義,其實(shí)現(xiàn)在CvvImage.CPP文件中match.h定義StereoMatchpoint_yze.h和Point定義 yzer定義所有的器,這是決定程序運(yùn)行Calib(負(fù)責(zé)標(biāo)定與匹配)StereoMatch(負(fù)責(zé)三維重建), ,,jluNewCameraDlg.cpp文件的代碼,敘述原程序的運(yùn)行過程操作流程:默認(rèn)參數(shù)->檢測(cè)角點(diǎn)->選擇左視圖->選擇右視圖->執(zhí)行標(biāo)定->選擇算法->默認(rèn)參數(shù)->生成視差圖->啟動(dòng)鼠標(biāo)獲 ②.檢測(cè)角點(diǎn);選擇文件,構(gòu)成文件序列,構(gòu)造calib類型對(duì)象,調(diào)用calib.detectCorners方法進(jìn)行角點(diǎn)檢測(cè),參數(shù)將會(huì)calib類型對(duì)象的屬性中,具體表現(xiàn)形式為在此類中CornerData,CornerData保 使用對(duì)象內(nèi)部定義的全局變量輸入?yún)?shù),Steteoparams中,getStereoCalibrateError()計(jì)算標(biāo)定誤差,調(diào)用rectifyStereoCamera()執(zhí)行雙目矯正,生remapMatrixs中,調(diào)用相關(guān)函數(shù)保calib-paras.xml文件中④.生成視差圖;這一步操作需要構(gòu)造stereoMatch類型對(duì)象,使用該類型的初始化方法從文件讀入標(biāo)定參數(shù),并根據(jù)用戶選擇的匹配算法(BM&SGBM)選擇該類中的響應(yīng)函數(shù)⑤.開始計(jì)算;首先使用上一步構(gòu)造的stereoMatch類型對(duì)象的getPointClouds方法得到三維點(diǎn)云隨后構(gòu)造PointCloudyzer類型對(duì)象,調(diào)用該類中的detectNearObject()方法檢測(cè)近距離目標(biāo)并得到目標(biāo)信息序列,調(diào)用showObjectInfo()方法得到近距離物體尺寸,該步驟反映到用戶界面上的效果是視差圖上的有效物體被⑥.啟動(dòng)鼠標(biāo)測(cè)距;用鼠標(biāo)的位置坐標(biāo)作為下標(biāo)三維以下,將會(huì)從:棋盤檢測(cè)標(biāo)定,匹配,矯正,三維重建等幾個(gè)主要的程序模塊對(duì)原程序進(jìn)行深入的解析,從此處開始,文中出現(xiàn)的變量名和函數(shù)名將會(huì)完全參考原程序,概述:請(qǐng)參考calib.h文件,在calib類中定義了四個(gè)結(jié)構(gòu)體:CornerDatas(角點(diǎn)數(shù)據(jù))CameraParams(相機(jī)參數(shù))StereoParams(立體參數(shù))RemapMatrix(重投矩陣),在調(diào)用jluNewcameraDlg.cpp中定義了對(duì)應(yīng)的全局變量,原程序的參數(shù)凡是涉及的這些全局變量,一路采用指針或者數(shù)的輸入?yún)?shù)和輸出參數(shù)均與這四個(gè)結(jié)構(gòu)體的內(nèi)部變量有關(guān),為了盡量表明內(nèi)部參數(shù)的傳遞,一些利用全局變兩個(gè)傳遞①.棋盤角點(diǎn)檢測(cè):需要注意,棋盤角點(diǎn)檢測(cè)是兩個(gè)頭個(gè)步驟:找焦點(diǎn)->亞像素求精->繪圖;把這個(gè)步驟看做一個(gè)算法的話,他的輸入是一個(gè)文件路徑序列,用來提供一點(diǎn)連接圖,另一個(gè)是角點(diǎn)數(shù)據(jù),CornerDatas中,在這里需要值得注意的參數(shù)傳遞問題為:CornerDataszhong的坐標(biāo)序列都是二維的,這是為了向標(biāo)定函數(shù)輸入?yún)?shù)的方便,但是OpenCV中的角點(diǎn)檢測(cè)函數(shù)和亞像素求精函數(shù)的輸出參數(shù)都在調(diào)用點(diǎn)處有一個(gè)循環(huán),利用這個(gè)循環(huán)向函數(shù)依次輸入文件處存疑.因?yàn)檫@里的效率提高很詭異,也許是因?yàn)檫z漏了什么②.利用角點(diǎn)檢測(cè)得到的數(shù)據(jù),就可以進(jìn)行標(biāo)定了.通過calibcalibrateStereoCamera()函數(shù)可以進(jìn)行雙目標(biāo)定,注意,原程序雖然定義了單目標(biāo)定方法,但是并不存在任何外calibrateStereoCamera()函數(shù)的內(nèi)部:標(biāo)定這一步驟很簡單,因?yàn)閛pencv完全封裝了這個(gè)操作,事實(shí)上,要進(jìn)行雙目標(biāo)定,必須先進(jìn)行單目標(biāo)定,cv::calibrateCamera()OpenCV的函數(shù)封裝了單鏡頭標(biāo)定的過程,而stereoCalibrate()這個(gè)函數(shù)封裝些系統(tǒng)函數(shù)同樣適用了指針和的模式,在使用它們的時(shí)候只需把他們看做是對(duì)于全局變量(就是那四個(gè)結(jié)構(gòu)體之,完成標(biāo)定操作之后,我們得到了什么呢?我們的stereoParams中寫入了有效的數(shù)據(jù),單目標(biāo)定的結(jié)果被文件之后,需要計(jì)算誤差值,和標(biāo)定一樣,目標(biāo)定誤差但是沒有調(diào)用過(>_<)直接調(diào)用calib::getStereoCalibrateError()函數(shù)計(jì)算立體標(biāo)定誤差值了,這個(gè)函數(shù)里面有一個(gè)很神奇的叫做極線約束的算法,鑒于本樣是輸出(醉了),這個(gè)值就是所謂的誤差值,不知道有什么卵用,目前發(fā)現(xiàn)的作用只有供用戶用來意.然后呢,居然是外部調(diào)用saveCalibrationDatas()這個(gè)方法保存了寫有立體標(biāo)定參數(shù)的xml文件,這里的操作邏輯異常的,目測(cè)原作者當(dāng)時(shí)并不是同一天寫的這段代碼,好吧反正到這里,我們那些神奇的用來的全局變量的作用到頭了,再往下,就要用到另一個(gè)類了,我敢保證你都想象不到這里面的參數(shù)傳遞有喪心病狂…..對(duì)了,②和③的操作發(fā)生在用戶點(diǎn)擊了④.然后,用戶應(yīng)該看見程序彈出了一個(gè)小窗口,里面寫著誤差值,告訴你我標(biāo)定完了.BMSGBM算法之中選擇一項(xiàng),并且填好算法需要的外參,然后,你應(yīng)該點(diǎn)擊”生成視差圖”這個(gè)按鈕,系統(tǒng)會(huì)讓你選擇一對(duì),我悄悄地告訴你,這里的代碼其實(shí)是從選擇棋盤圖那里來的,所以存我們應(yīng)該選擇那個(gè)保存了立體標(biāo)定參數(shù)的xml文件,順便說一句,xml文件讀寫代碼貌似有點(diǎn)問題,因?yàn)榘蠢韥碚f到這里應(yīng)該有好幾個(gè)文件了,但是我就找到了一個(gè)還好他就是要這個(gè).:StereoMatch類型對(duì)象,這個(gè)類里面有一個(gè)初始化方法,其實(shí)就是用來這個(gè)xml文件,并且按照原樣在自己的對(duì)象內(nèi)件做的,然后,在該的觸發(fā)器中,原程序做了一些檢測(cè),來確保你讀入的這些數(shù)據(jù)所標(biāo)定的相機(jī)是拍攝待測(cè)的這個(gè)相機(jī),然后StereoMatchBMSGBM這兩個(gè)定義的和標(biāo)定有關(guān)的參數(shù)!到這個(gè)函數(shù)里面看一下:在match.cpp中,原來是有一個(gè)載入?yún)?shù)的函數(shù)loadCalibData()采用內(nèi)部調(diào)用的方式對(duì)本對(duì)象的內(nèi)部的全局變量進(jìn)行了賦值,然后這兩個(gè)異常神奇的算法直接用全局變量就行了,值得注意的是,這calib類中完全不同三個(gè)窗口里面出現(xiàn)了一幅偽.⑤.接下來,你應(yīng)該點(diǎn)擊”開始計(jì)算”這個(gè)按鈕.程序會(huì)外部調(diào)用stereoMatcher中的getPointClouds()來生成三維點(diǎn)云,這個(gè)東西就是所謂的三維重建的結(jié)果.好了,我們最短命的一個(gè)對(duì)象來了,這就是最關(guān)鍵的PointCloudyzer類型對(duì)象,這里面才是和本程序最的功能--測(cè)距有關(guān)的東西,這次只需要一個(gè)參數(shù),就是那個(gè)三維點(diǎn)云.detectNearObject()方法可以得到目標(biāo)信息序列,然后調(diào)用showObjectInfo()方法,這個(gè)需要輸入上一步生成的目標(biāo)信息序列,把它按照從近到遠(yuǎn)排序,然后還會(huì)把左視圖上提取的目標(biāo)位置信息疊加到視差圖上,你會(huì)看到上出現(xiàn)了幾個(gè)框,然后,觸發(fā)器負(fù)責(zé)去一個(gè)三維點(diǎn)云我并不知道里面存著什么樣的數(shù)據(jù),我現(xiàn)在只知道他是上一部分點(diǎn)的三維坐標(biāo),可以用二維坐標(biāo),也就是這個(gè)點(diǎn)在上的幾何位置來這個(gè)數(shù)組,得到該點(diǎn)的另一真正的距離信息,但是顯而易見的是遮擋和透明物體會(huì)使得算法嚴(yán)重失準(zhǔn).但是我感覺這個(gè)程序好像直接返回了深度信⑥.總結(jié)一下,這個(gè)程序好像是由三個(gè)部分拼接起來的,這種很奇怪的感覺,或者說白了不像是同一個(gè)人寫的,第二部分是,就是那幾個(gè)算法,我個(gè)人覺得實(shí)現(xiàn)那些算法挺有難度的,第三部分是PointCloudyzer這個(gè)類,這里面問題,他根本就沒有計(jì)算,任何計(jì)算都沒有,兩個(gè)點(diǎn)的距離也沒什么大的問題,反正這個(gè)類就是一個(gè)問題十有這個(gè)實(shí)驗(yàn)數(shù)據(jù)有.還有按照距離排序那個(gè)地方我覺得邏輯很神奇,排序有什么用啊,除了浪費(fèi)時(shí)間并沒有感樣子,OpenCV自己的庫函數(shù)就有這樣的特點(diǎn),用指針和全局量,他這樣寫程序可以大大減少用來傳遞參數(shù)的臨時(shí)變量數(shù)目,還有那個(gè)文件名之所以不是完全對(duì)應(yīng)的,然后就是整個(gè)代碼里面都充斥著一種奇怪的異常處理邏輯,好吧我承認(rèn)我水平有限無法理解大神的思路,不過的確有二.EmguCV為基礎(chǔ)的程序(以下稱新程序)的解決方案設(shè)計(jì)我唯一的可靠地參考資料,這個(gè)段落我就說設(shè)計(jì)的這個(gè)東西他底層其實(shí)是對(duì)OpenCV的外部調(diào)用,就是一個(gè)殼.因?yàn)镃++這個(gè)東西他是非托管代碼,C#的原理他就跟Java一樣是托管的,所以就兩條路,OPenCV的代碼,要不就再封裝,這兩條路EmguCV里面都有用詳情看對(duì)照表總之你知道這個(gè)東西效率不會(huì)比OpenCV低很多,而且面向?qū)ο蟮姆绞綆淼脑O(shè)計(jì)便利甚表解決,但是也存在一些映射不出來的神奇的參數(shù),就是EmguCV自己獨(dú)創(chuàng)的,這個(gè)比較,不過總體上來講還可以我打算利用C特有的屬性字段就是那個(gè)自帶get&set方法組的變量來做類之間的參數(shù)傳遞,xml文件的讀寫挺神奇的,EmguCV里面沒有映射函數(shù),好在不是了,xml文件傳遞那么復(fù)雜的參構(gòu),vs這樣基于多個(gè)頂級(jí)文檔的,NB了三.OpenCVEmguCVOpenCV開發(fā)環(huán)境:注意,這個(gè)環(huán)境是用來打開原程序的,我的新程序不需要你安裝OpenCV,還有,OpenCV多個(gè),因?yàn)闆]有表和運(yùn)行庫,你只需要在path變量中添加opencv的bin就行.有一個(gè)x86/vc12/bin;還有一個(gè)x64/vc12/bin;個(gè)人覺得這兩個(gè)最好全,雖然原程序x86平臺(tái)的,至于解決方案內(nèi)部的設(shè)置,請(qǐng)參考具體的EmguCV開發(fā)環(huán)境,注意,這個(gè)東西是一個(gè)安裝包,所以假設(shè)你一共不到兩個(gè)GB,里面含有運(yùn)行庫,無人值守安裝時(shí)務(wù)必關(guān)閉一切殺毒軟件例如某衛(wèi)士,配置這個(gè)的時(shí)候,path變量里面寫三個(gè),C:\ProgramFiles\emgucv-windows-universal-cuda2.4.10.1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論