OpenCV學習筆記(16)雙目測距與三維重建的OpenCV實現(xiàn)問題集錦圖像獲取與單目定標_第1頁
OpenCV學習筆記(16)雙目測距與三維重建的OpenCV實現(xiàn)問題集錦圖像獲取與單目定標_第2頁
OpenCV學習筆記(16)雙目測距與三維重建的OpenCV實現(xiàn)問題集錦圖像獲取與單目定標_第3頁
OpenCV學習筆記(16)雙目測距與三維重建的OpenCV實現(xiàn)問題集錦圖像獲取與單目定標_第4頁
OpenCV學習筆記(16)雙目測距與三維重建的OpenCV實現(xiàn)問題集錦圖像獲取與單目定標_第5頁
全文預覽已結(jié)束

下載本文檔

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

文檔簡介

1、OpenCV學習筆記(16)雙目測距與三維重建的OpenCV實現(xiàn)問題集錦(一)圖像獲取與單目定標雙目測距的基本原理I;/;l!:/:l!:/:!Disparity如上圖所示,雙目測距主要是利用了目標點在左右兩幅視圖上成像的橫向坐標直接存在的差異(即視差出二一疋_)與目標點到成像平面的距離Z存在著反比例的關(guān)系:Z=fT/doscyscyao:在OpenCV中,f的量綱是像素點,T的量綱由定標板棋盤格的實際尺寸和用戶輸入值確定,一般是以毫米為單位(當然為了精度提高也可以設(shè)置為0.1毫米量級),d=xl-xr的量綱也是像素點。因此分子分母約去,Z的量綱與T相同?!盜)假設(shè)目標點在左視圖中的坐標為(x

2、,y),在左右視圖上形成的視差為d,目標點在以左攝像頭光心為原點的世界坐標系中的坐標為(X,Y,Z),則存在上圖所示的變換矩陣Q,使得Q*xydl=XYZW,oV-cXrXyrYdf-d+c一c:rZ1TIVL4.00Q-TJscyscyao:為了精確地求得某個點在三維空間里的距離Z,我們需要獲得的參數(shù)有焦距f、視差d、攝像頭中心距Tx。如果還需要獲得X坐標和Y坐標的話,那么還需要額外知道左右像平面的坐標系與立體坐標系中原點的偏移ex和cy。其中f,Tx,ex和cy可以通過立體標定獲得初始值,并通過立體校準優(yōu)化,使得兩個攝像頭在數(shù)學上完全平行放置,并且左右攝像頭的ex,cy和f相同(也就是實現(xiàn)

3、圖2中左右視圖完全平行對準的理想形式)。而立體匹配所做的工作,就是在之前的基礎(chǔ)上,求取最后一個變量:視差d(這個d般需要達到亞像素精度)。從而最終完成求一個點三維坐標所需要的準備工作。在清楚了上述原理之后,我們也就知道了,所有的這幾步:標定、校準和匹配,都是圍繞著如何更精確地獲得f,d,Tx,ex和cy而設(shè)計的?!币?、圖像的獲取1如何打開兩個或多個攝像頭?可以通過OpenCV的capture類函數(shù)或者結(jié)合DirectShow來實現(xiàn)雙攝像頭的捕獲,具體可見我的讀書筆記OpenCV學習筆記(6)基于VC+OpenCV+DirectShow的多個攝像頭同步工作。文中曾提及不能用cvCreateCam

4、eraCapture同時讀取兩個攝像頭,不過后來一位研友來信討論說只要把攝像頭指針的創(chuàng)建代碼按照攝像頭序號降序執(zhí)行,就可以順利打開多個攝像頭,例如:viewplaincopytoclipboardprint?CvCapture*capture2=cvCreateCameraCapture(1);CvCapture*capturel=cvCreateCameraCapture(0);釆用DirectShow的方式讀入時:viewplaincopytoclipboardprint?camera2.OpenCamera(1,false,640,480);cameral.OpenCamera(0,fa

5、lse,640,480);這樣就可以同時釆集兩個攝像頭。我也驗證過這種方法確實有效,而且還解決了我遇到的cvSetCaptureProperty調(diào)整幀畫面大小速度過慢的問題。當攝像頭的打開或創(chuàng)建代碼按照攝像頭序號從0開始以升序編寫執(zhí)行時,使用cvSetCaptureProperty就會出現(xiàn)第一個攝像頭(序號為0)的顯示窗口為灰色(即無圖像)、且程序運行速度緩慢的現(xiàn)象。而改為降序編寫執(zhí)行后,則能正常、實時地顯示各攝像頭的畫面。具體原因有待分析討論。如何實現(xiàn)多個攝像頭幀畫面的同步抓???在單攝像頭情況下用cvQueryFrame即可抓取一幀畫面,實際上這個函數(shù)是由兩個routine組成的:cvGra

6、bFrame和cvRetrieveFrame(詳見LearningOpenCV第103頁)。cvGrabFrame將攝像頭幀畫面即時復制到內(nèi)部緩存中,然后通過cvRetrieveFrame把我們預定義的一個IplImage型空指針指向緩存內(nèi)的幀數(shù)據(jù)。注意這時我們并沒有真正把幀數(shù)據(jù)取出來,它還保存在OpenCV的內(nèi)部緩存中,下一次讀取操作就會被覆蓋掉。所以一般我們要另外定義一個IplImage來復制所抓取的幀數(shù)據(jù),然后對這個新IplImage進行操作。由上面的解釋也可以看出,cvGrabFrame的作用就是盡可能快的將攝像頭畫面數(shù)據(jù)復制到計算機緩存,這個功能就方便我們實現(xiàn)對多個攝像頭的同步抓取,

7、即首先用cvGrabFrame依次抓取各個CvCapture*,然后再用cvRetrieveFrame把幀數(shù)據(jù)取出來。例如:viewplaincopytoclipboardprint?cvGrabFrame(lfCam);cvGrabFrame(riCam);3framel二cvRetrieveFrame(IfCam);4frame2二cvRetrieveFrame(riCam);if(!framel|!frame2)break;cvCopylmage(framel,imagel);cvCopylmage(frame2,image2);二、攝像頭定標2A兀人+p“十2叩A(chǔ)(八+2PN兒攝像頭定

8、標一般都需要一個放在攝像頭前的特制的標定參照物(棋盤紙),攝像頭獲取該物體的圖像,并由此計算攝像頭的內(nèi)外參數(shù)。標定參照物上的每一個特征點相對于世界坐標系的位置在制作時應精確測定,世界坐標系可選為參照物的物體坐標系。在得到這些己知點在圖像上的投影位置后,可計算出攝像頭的內(nèi)外參數(shù)。如上圖所示,攝像頭由于光學透鏡的特性使得成像存在著徑向畸變,可由三個參數(shù)kl,k2,k3確定;由于裝配方面的誤差,傳感器與光學鏡頭之間并非完全平行,因此成像存在切向畸變,可由兩個參數(shù)pl,p2確定。單個攝像頭的定標主要是計算出攝像頭的內(nèi)參(焦距f和成像原點ex,cy.五個畸變參數(shù)(一般只需要計算出kl,k2,pl,p2,

9、對于魚眼鏡頭等徑向畸變特別大的才需要計算k3)以及外參(標定物的世界坐標)。OpenCV中使用的求解焦距和成像原點的算法是基于張正友的方法(兇f),而求解畸變參數(shù)是基于Brown的方法(匹f)。圖像坐標系、攝像頭坐標系和世界坐標系的關(guān)系11%0%V2堆y100I1Y圖像坐標系(u.vh(出Yb為草住的厲*坐標彊像機坐標系和世界坐標(耳“一乙兒QP的釀CWI坐標(心Y.2J:戍吧p界黑標工Z.r空間任何一點P在圖像上的成世位賈可以用針孔模型近似農(nóng)示:M為3X4矩陣.稱為投影矩陣二M;卜由L、%決定.只與攝像機內(nèi)部結(jié)構(gòu)有關(guān).這些參數(shù)稱為攝像挑內(nèi)辭參數(shù);W完全由撮倫機相對于世界坐標系的方位決定.稱為

10、攝厲機的外郵參數(shù),X比為空何點在世界坐標系下的齊次坐標攝像頭成像兒何關(guān)系,其中a點稱為攝像頭(透鏡)的光心,Xc軸和Yc軸與圖像的X軸和Y軸平行,zc軸為攝像頭的光軸,它與圖像平面垂直。光軸與圖像平面的交點0,即為圖像坐標系的原點。由點a與Xc、Yc、乙軸組成的坐標系稱為攝像頭坐標系,00:的距離為攝像頭焦距,用f表示。圖像坐標系是一個二維平面,乂稱為像平面,scyscya。:實際上就是攝像頭的CCD傳感器的表面。每個CCD傳感器都有一定的尺寸,也有一定的分辨率,這個就確定了毫米與像素點之間的轉(zhuǎn)換關(guān)系。舉個例子,CCD的尺寸是8mmX6mm,幀畫面的分辨率設(shè)置為640X480,那么毫米與像素點

11、之間的轉(zhuǎn)換關(guān)系就是80pixel/mm?!痹O(shè)CCD傳感器每個像素點的物理大小為dx*dy,相應地,就有dx=dy=l/80a進行攝像頭定標時,棋盤方格的實際大小squarjsize(默認為1Of)的設(shè)置對定標參數(shù)是否有影響?scyscyao:當然有。在標定時,需要指定一個棋盤方格的長度,這個長度(一般以毫米為單位,如果需要更精確可以設(shè)為0.1毫米量級)與實際長度相同,標定得出的結(jié)果才能用于實際距離測量。一般如果尺寸設(shè)定準確的話,通過立體標定得出的Translation向量的第一個分量Tx的絕對值就是左右攝像頭的中心距。一般可以用這個來驗證立體標定的準確度。比如我設(shè)定的棋盤格大小為270(27m

12、m),最終得出的Tx大小就是602.8(60.28mm),相當精確。”定標所得的攝像頭內(nèi)參數(shù),即焦距和原點坐標,其數(shù)值單位都是一致的嗎?怎么把焦距數(shù)值換算為實際的物理量?“wobject:是的,都是以像素為單位。假設(shè)像素點的大小為kx1,單位為mm,則fx=f/k,fy=f/(1*sinA),A般假設(shè)為90,是指攝像頭坐標系的偏斜度(就是鏡頭坐標和CCD是否垂直)。攝像頭矩陣(內(nèi)參)的目的是把圖像的點從圖像坐標轉(zhuǎn)換成實際物理的三維坐標。因此其中的fx,fy,ex,cy都是使用類似上面的綱量。同樣,Q中的變量f,ex,cy也應該是一樣的?!逼灞P圖像數(shù)目應該取多少對攝像頭定標比較適宜?OpenCV

13、中文論壇上piao的帖子在OpenCV中用cvCalibrateCame:ra2進行相機標定(附程序)中指出影響攝像頭定標結(jié)果的準確,(1)標定板所在平面與成像平面(imageplane)之間的夾角;(2)標定時拍攝的圖片數(shù)目(棋盤圖像數(shù)目);(3)圖像上角點提取的不準確。感覺OpenCV1.2以后對圖像角點的提取準確度是比較高的,cvFindChessboardCorners和cvFindCornerSubPix結(jié)合可以獲得很好的角點檢測效果(hqhuangl在HQ角點檢測(CornerDetection)cvFindCornerSubPix使用范例中給出了相關(guān)的應用范例)。因此,影響定標結(jié)

14、果較大的就是標定板與鏡頭的夾角和棋盤圖像數(shù)目,在實際定標過程中,我感覺棋盤圖像數(shù)目應該大于20張,每成功檢測一次完整的棋盤角點就要變換一下標定板的姿態(tài)(包括角度、距離)。單目定標函數(shù)cvCalibrateCamera2釆用怎樣的flags比較合適?由于一般鏡頭只需要計算kl,k2,pl,p2四個參數(shù),所以我們首先要設(shè)置CV_CALIB_FIX_K3;其次,如果所用的攝像頭不是高端的、切向畸變系數(shù)非常少的,則不要設(shè)置CV_CALIB_ZERO_TANGENT_DIST,否則單目校正誤差會很大;如果事先知道攝像頭內(nèi)參的大概數(shù)值,并cvCalibrateCamera2函數(shù)的第五個參數(shù)intrinsic_matrix非空,則也可設(shè)置CV_CALIB_USE_INTRINSIC_GUESS,以輸入的intrin

溫馨提示

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

評論

0/150

提交評論