OpenCV用C++語(yǔ)言編寫,它的主要接口也是C++語(yǔ)言,但是依然保留了大量的C語(yǔ)言接口。該庫(kù)也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。這些語(yǔ)言的API接口函數(shù)可以通過(guò)在線文檔獲得。如今也提供對(duì)于C#,Ch, Ruby的支持。
所有新的開發(fā)和算法都是用C++接口。
基于OpenCV的三維重建算法。該算法充分發(fā)揮了OpenCV的函數(shù)庫(kù)功能,提高了計(jì)算的精度效率,具有良好的跨平臺(tái)移植性,可以滿足各種計(jì)算機(jī)視覺(jué)系統(tǒng)的需要。
OpenCV三維重建的實(shí)現(xiàn)
引言
三維重建技術(shù)是計(jì)算機(jī)視覺(jué)、人工智能、虛擬現(xiàn)實(shí)等前沿領(lǐng)域的熱點(diǎn)和難點(diǎn),也是人類在基礎(chǔ)研究和應(yīng)用研究中面臨的重大挑戰(zhàn)之一?;趫D像的三維重建是圖像處理的一個(gè)重要研究分支,作為當(dāng)今熱門的虛擬現(xiàn)實(shí)和科學(xué)可視化的基礎(chǔ),它被廣泛應(yīng)用于檢測(cè)和觀察中。一個(gè)完整的三維重建系統(tǒng)通??煞譃閳D像獲取、攝像機(jī)標(biāo)定、特征點(diǎn)提取、立體匹配、深度確定和后處理等6大部分[1] [3]。
其中精確標(biāo)定攝像機(jī)內(nèi)外參數(shù)和立體匹配是三維重建中最重要也是最困難的問(wèn)題。 開放源代碼的計(jì)算機(jī)視覺(jué)類庫(kù)OpenCV(Open Source Computer Vision Library)由英特爾公司位于俄羅斯的研究實(shí)驗(yàn)室所開發(fā),它是一套可免費(fèi)獲得的由一些C函數(shù)和C 類所組成的庫(kù),用來(lái)實(shí)現(xiàn)一些常用的圖像處理及計(jì)算機(jī)視覺(jué)算法[2]。
OpenCV與英特爾公司所開發(fā)的另一圖像處理庫(kù)IPL(Image Processing Library)兼容, IPL用于實(shí)現(xiàn)對(duì)數(shù)字圖像的一些低級(jí)處理,而OpenCV則主要用于對(duì)圖像進(jìn)行一些高級(jí)處理,比如說(shuō)特征檢測(cè)與跟蹤、運(yùn)動(dòng)分析、目標(biāo)分割與識(shí)別以及3D重建等。由于OpenCV的源代碼是完全開放的,而且源代碼的編寫簡(jiǎn)潔而又高效,特別是其中大部分的函數(shù)都已經(jīng)過(guò)匯編最優(yōu)化,以使之能高效而充分地利用英特爾系列處理芯片的設(shè)計(jì)體系,
對(duì)于Pentium MMX, Pentium, Pentium Ⅲ及Pentium Ⅳ這些處理器而言,OpenCV的代碼執(zhí)行效率是非常高的,所以近年來(lái)在國(guó)外的圖像處理相關(guān)領(lǐng)域中被廣泛地使用,成為一種流行的圖像處理軟件。OpenCV中的攝像機(jī)標(biāo)定模塊為用戶提供了良好的接口,同時(shí)支持Windows、Linux 平臺(tái),有效地提高了開發(fā)效率,并且執(zhí)行速度快,具有良好的跨平臺(tái)移植性,因此可以很好地應(yīng)用于工程實(shí)際當(dāng)中。
2 三維重建的基本原理
2.1 圖像獲取
立體圖像的獲取是立體視覺(jué)的基礎(chǔ),圖像獲取的方式很多,主要取決于應(yīng)用的場(chǎng)合和目的,還要考慮視點(diǎn)差異、光照條件、攝像機(jī)性能以及景物特點(diǎn)等因素的影響,以利于立體計(jì)算。
2.2 攝像機(jī)標(biāo)定
攝像機(jī)標(biāo)定是為了建立成像模型、確定攝像機(jī)的位置和屬性參數(shù),以確定空間坐標(biāo)系中物體點(diǎn)同它的像點(diǎn)之間的對(duì)應(yīng)關(guān)系。兩個(gè)攝像機(jī)都要標(biāo)定,如果攝像機(jī)是固定的,當(dāng)從2-D計(jì)算機(jī)圖像坐標(biāo)推導(dǎo)3-D信息時(shí),只需一次標(biāo)定。 攝像機(jī)的標(biāo)定方法可分為兩大類:第一類是直接估計(jì)攝像機(jī)的位置、光軸方向、焦距等參數(shù);第二類是通過(guò)最小二乘法擬合,確定三維空間點(diǎn)映射為二維圖像點(diǎn)的變換矩陣。一個(gè)有效的攝像機(jī)模型,除了能夠精確地恢復(fù)出空間景物的三維信息外,還有利于解決立體匹配問(wèn)題。
2.3 特征提取
由多視點(diǎn)的視差確定3-D信息,關(guān)鍵是確定場(chǎng)景中同一物點(diǎn)在不同圖像中的對(duì)應(yīng)關(guān)系,解決該問(wèn)題的方法之一是選擇合適的圖像特征并進(jìn)行匹配。特征是像素或像素集合或它們的抽象表達(dá),常用的匹配特征主要有點(diǎn)狀特征、線狀特征和區(qū)域特征等。一般來(lái)講,大尺度特征含有較豐富的信息,本身數(shù)目較少,易于得到快速匹配,但對(duì)它們的提取與描述相對(duì)復(fù)雜,定位精度也差;而小尺度特征本身的定位精度高,表達(dá)描述簡(jiǎn)單,但數(shù)目較多,所含信息量卻較少,因而在匹配時(shí)需要采用較強(qiáng)的約束準(zhǔn)則和匹配策略。
合理的選擇匹配特征對(duì)立體匹配工作有十分重要的意義,應(yīng)綜合考慮各種因素,根據(jù)不同的景物特點(diǎn)和應(yīng)用要求選擇。一般的,對(duì)于包含有大量非規(guī)則形狀和高度突變的場(chǎng)景,比較適合提取點(diǎn)狀特征,因?yàn)樘崛【€段、區(qū)域等特征既困難又會(huì)引入誤差:對(duì)于具有規(guī)則結(jié)構(gòu)的場(chǎng)景,若線段和區(qū)域特征的提取和描述比較容易且誤差較小,應(yīng)提取線段特征以實(shí)現(xiàn)快速匹配。
2.4 立體匹配
立體匹配是根據(jù)對(duì)所選特征的計(jì)算,建立特征間的對(duì)應(yīng)關(guān)系,將同一個(gè)空間點(diǎn)在不同圖像中的映像點(diǎn)對(duì)應(yīng)起來(lái),并由此得到相應(yīng)的視差圖像,立體匹配是雙目視覺(jué)中最重要也是最困難的問(wèn)題。當(dāng)空間三維場(chǎng)景被投影為二維圖像時(shí),同一景物在不同視點(diǎn)下的圖像會(huì)有很大不同,而且場(chǎng)景中的諸多因素,如光照條件、景物幾何形狀和物理特性、噪聲干擾和畸變以及攝像機(jī)特性等,都被綜合成單一的圖像灰度值。
因此,要準(zhǔn)確的對(duì)包含了如此之多不利因素的圖像進(jìn)行無(wú)歧義匹配十分困難。 立體匹配的方法主要分為兩大類,即灰度相關(guān)和特征匹配?;叶认嚓P(guān)直接用象素灰度進(jìn)行匹配,該方法優(yōu)點(diǎn)是匹配結(jié)果不受特征檢測(cè)精度和密度的影響,可以得到很高的定位精度和密集的視差表面;缺點(diǎn)是依賴于圖像灰度統(tǒng)計(jì)特性,對(duì)景物表面結(jié)構(gòu)以及光照反射較為敏感,因此在空間景物表面缺乏足夠紋理細(xì)節(jié)、成像失真較大(如基線長(zhǎng)度過(guò)大)的場(chǎng)合存在一定困難。
基于特征的匹配方法的優(yōu)點(diǎn)是使用從強(qiáng)度圖像得到的特征作為匹配基元,所以在環(huán)境照明發(fā)生變化的情況下較為穩(wěn)定;缺點(diǎn)是特征提取需要額外計(jì)算量,另外由于特征是離散的,所以不能在匹配后直接得到密集的視差場(chǎng)。
匹配方法需要解決以下問(wèn)題:選擇正確的匹配特征;尋找特征間的本質(zhì)屬性;建立能正確匹配所選特征的穩(wěn)定算法。
2.5 深度信息確定
當(dāng)通過(guò)立體匹配得到視差圖像后,就可以確定深度圖像并恢復(fù)場(chǎng)景3-D信息了。影響距離測(cè)量精度的因素主要有攝像機(jī)標(biāo)定誤差、數(shù)字量化效應(yīng)、特征檢測(cè)與匹配定位精度等,一般來(lái)講,距離測(cè)量精度與匹配定位精度成正比,與攝像機(jī)基線長(zhǎng)度成反比。增大基線長(zhǎng)度可以改善深度測(cè)量精度,但同時(shí)會(huì)增大圖像間的差異,增加匹配的困難程度。因此,要設(shè)計(jì)一個(gè)精確的立體視覺(jué)系統(tǒng),必須綜合考慮各方面的因素,保證各環(huán)節(jié)都具有較高的精度。
2.6 后處理
后處理包括深度插值、誤差校正和精度改善。立體視覺(jué)的最終目的是恢復(fù)景物可視表面的完整信息,目前,無(wú)論哪種匹配方法都不可能恢復(fù)出所有圖像點(diǎn)的視差,因此對(duì)于一個(gè)完整的立體視覺(jué)系統(tǒng),必須進(jìn)行最終的表面內(nèi)插重建。
3 基于OpenCV的三維重建
OpenCV中采用的定標(biāo)方法是介于傳統(tǒng)定標(biāo)方法和自定標(biāo)方法之間的一種方法,由在其論文中提出的。這種方法不需要知道攝像機(jī)運(yùn)動(dòng)的具體信息,這點(diǎn)比傳統(tǒng)定標(biāo)技術(shù)更為靈活,同時(shí)仍需要一個(gè)特定的標(biāo)定物以及一組已知的特征基元的坐標(biāo),這點(diǎn)不如自定標(biāo)靈活。它通過(guò)在至少3個(gè)不同的位置獲取標(biāo)定物的圖像,計(jì)算出攝像機(jī)所有的內(nèi)外參數(shù)。
由于它比傳統(tǒng)定標(biāo)技術(shù)更為靈活,又可以得到不錯(cuò)的定標(biāo)精度,所以被OpenCV所采納。 在這個(gè)模型的定標(biāo)過(guò)程中將用到的三個(gè)坐標(biāo)系:圖像坐標(biāo)系,攝像機(jī)坐標(biāo)系和世界坐標(biāo)系。通過(guò)坐標(biāo)系之間的變換可以通過(guò)下面的公式把圖像坐標(biāo)系的點(diǎn)和世界坐標(biāo)系[7] [8]:
由于矩陣A包含了攝像機(jī)全部的6個(gè)內(nèi)參數(shù)
,所以稱A為攝像機(jī)內(nèi)參數(shù)矩陣。PC為模型的外參數(shù)矩陣,可以通過(guò)以下公式得到:
其中,
為旋轉(zhuǎn)矩陣,
為平移向量。
基于OpenCV的攝像機(jī)標(biāo)定采用通用的棋盤標(biāo)定模板,先用函數(shù)cvFindChessboardCorners()粗略提取出棋盤的角點(diǎn),然后再使用FindCornerSubPix()函數(shù),進(jìn)一步精確得到角點(diǎn)亞象素級(jí)的坐標(biāo)值。最后把坐標(biāo)值代入cvCalibrateCamera2()函數(shù),得到攝像機(jī)的內(nèi)外參數(shù)值(效果如圖1所示)。
圖1 提取角點(diǎn)并顯示的效果圖(棋盤取自O(shè)penCV) OpenCV中有Sobel,Laplace,Canny等幾種用于邊緣檢測(cè)的算子。但一般使用坎尼(Canny)算子也就是cvCanny()函數(shù)做邊緣檢測(cè)和特征提?。ㄈ鐖D2)。
圖2 做Canny處理后的比較圖 三維重建中最大的難點(diǎn)也是最重要的部分就是立體匹配部分。在OpenCV中選用基于特征匹配中的極線約束方法[9]。 假設(shè)空間一點(diǎn)P,它在兩個(gè)攝像機(jī)成像平面上的投影點(diǎn)分別為P1和P2,如圖3所示。其中,C1和C2分別為兩個(gè)攝像機(jī)的中心,即攝像機(jī)坐標(biāo)系的原點(diǎn)。
在極線幾何中,我們稱C1和C2的連線為基線?;€和兩攝像機(jī)成像平面的交點(diǎn)e1和e2分別為兩攝像機(jī)的極點(diǎn),它們分別為兩個(gè)攝像機(jī)中心C1和C2在對(duì)應(yīng)的攝像機(jī)成像平面上的投影坐標(biāo)。P、C1和C2組成的三角平面稱為極平面π。π和兩個(gè)攝像機(jī)成像平面的交線l1和l2稱為極線,一般稱l1為點(diǎn)P2對(duì)應(yīng)的極線,l2為點(diǎn)P1對(duì)應(yīng)的極線,l1和l2互為對(duì)應(yīng)極線。
圖3 我們?cè)跇O平面π上另取一點(diǎn)P′,從圖中可以看到,它在兩攝像機(jī)平面上的投影點(diǎn)為P1和P2′,其中,P2和P2′都在極線l2上。這就是極線約束,即當(dāng)給定一點(diǎn)P1,它的匹配點(diǎn)一定出現(xiàn)在它所對(duì)應(yīng)的極線上,由此,可以將我們的搜索空間壓縮到一維的直線,即極線上。
在OpenCV中可以先使用函數(shù)cvFindFundamentalMat()求出圖像的基礎(chǔ)矩陣,然后用把求得的基礎(chǔ)矩陣代入函數(shù)cvComputeCorrespondEpilines()函數(shù)中求出一幅圖像中的點(diǎn)在另一幅圖像中的對(duì)應(yīng)極線。
求得極線后,對(duì)圖像上沿極線方向上的像素點(diǎn)進(jìn)行灰度相似性的匹配,能很方便的找出該點(diǎn)在對(duì)應(yīng)圖像上的匹配點(diǎn)。
4 實(shí)驗(yàn)結(jié)果
基于上述原理和OpenCV的函數(shù),利用VC6.0開發(fā)了一個(gè)全套的三維重建系統(tǒng)。通過(guò)上述的6個(gè)步驟最終還原出了物體的圖形。程序經(jīng)過(guò)嚴(yán)格的測(cè)試,運(yùn)行穩(wěn)定。在進(jìn)行相機(jī)標(biāo)定時(shí),要注意的是:照片越多(至少3幅)計(jì)算的內(nèi)外參數(shù)就越精確。而且其中任意兩幅圖像所對(duì)應(yīng)的攝像機(jī)光軸不能是平行的。
圖4 實(shí)驗(yàn)所用到的左右對(duì)應(yīng)圖像
圖5 提取到的輪廓
圖6 匹配過(guò)程(圖中白點(diǎn)標(biāo)記為一對(duì)對(duì)應(yīng)點(diǎn))
圖7 點(diǎn)重建的效果圖(使用OpenGL重建)
5 結(jié)束與展望
三維重建視覺(jué)作為計(jì)算機(jī)視覺(jué)中的一個(gè)重要分支,一直是計(jì)算機(jī)視覺(jué)研究的重點(diǎn)和熱點(diǎn)之一。它直接模擬了人類視覺(jué)處理景物的方式,可以在多種條件下靈活地測(cè)量景物的立體信息。對(duì)它的研究,無(wú)論是在視覺(jué)生理的角度還是在工程應(yīng)用的角度都具有十分重要的意義。三維重建視覺(jué)技術(shù)在由物體的二維圖像獲得物體的深度信息上具有很大的優(yōu)越性。 本文利用OpenCV開發(fā)的三維重建的系統(tǒng)具有計(jì)算簡(jiǎn)單,結(jié)果精確,運(yùn)行效率高,可以跨多平臺(tái)等優(yōu)點(diǎn)。
系統(tǒng)可以有效的應(yīng)用于各種可使用計(jì)算機(jī)視覺(jué)的應(yīng)用中。 本試驗(yàn)系統(tǒng)適宜于測(cè)量范圍不太大、遮擋較少的空間物體的三維測(cè)量,對(duì)于遮擋較嚴(yán)重的情況,我們需要增加攝像機(jī)的數(shù)目,從更多方向?qū)ξ矬w進(jìn)行攝像,通過(guò)在多個(gè)方向上運(yùn)用雙目立體視覺(jué)原理進(jìn)行三維重建。
評(píng)論