/免責(zé)聲明> 說到這里,后面的我負(fù)責(zé)了。 我們從哪里開始? 從整體上看這個(gè)項(xiàng)目可能會(huì)比實(shí)際上更困難。所幸的是,我們能夠把它劃分成更小的部分,當(dāng)這些部分合并在一起時(shí),我們就可以使增強(qiáng)現(xiàn)實(shí)應(yīng)用程序工作了?,F(xiàn)在的問題是,我們需要哪些更小的塊? 1、識(shí)別參考平面。 2、估計(jì)單應(yīng)性。 3、從單應(yīng)性推導(dǎo)出從參考面坐標(biāo)系到目標(biāo)圖像坐標(biāo)系的轉(zhuǎn)換。 4、在圖像(像素空間)中投影我們的3D模型并繪制它。 圖2:概述增強(qiáng)現(xiàn)實(shí)應(yīng)用程序的整個(gè)過程。 我們將使用的主要工具是Python和OpenCV,因?yàn)樗鼈兌际情_源的,易于建立和使用,并且使用它們能快速構(gòu)建原型。用到代數(shù),我將使用numpy。 圖3:左側(cè),從我將使用的表面模型中提取的特征。右側(cè),從場景中提取的特征。注意,最右側(cè)圖形的角落是如何檢測為興趣點(diǎn)的。 特征描述 一旦找到特征,我們應(yīng)該找到它們提供的信息的適當(dāng)表示形式。這將允許我們在其它圖像中尋找它們,并且還可以獲取比較時(shí)兩個(gè)檢測到的特征相似的度量。描述符提供由特征及其周圍環(huán)境給出的信息的表示。一旦描述符被計(jì)算出來,待識(shí)別的對象就可以被抽象成一個(gè)特征vector,該vector包含圖像和參考對象中發(fā)現(xiàn)的關(guān)鍵點(diǎn)的描述符。 圖4:參考面和場景之間找到最接近的15個(gè)暴力匹配 最后,在找到匹配之后,我們應(yīng)該定義一些標(biāo)準(zhǔn)來決定對象是否被找到。為此,我定義了應(yīng)該找到的最小匹配數(shù)的閾值。如果匹配的數(shù)量高于閾值,則我們假設(shè)對象該已經(jīng)被找到。否則,我們認(rèn)為沒有足夠的證據(jù)表明識(shí)別是成功的。 使用OpenCV ,所有這些識(shí)別過程都可以用幾行代碼完成: 圖5:平面和圖像之間的單應(yīng)。來源: F. Moreno. 我們怎么能找到這樣的轉(zhuǎn)變呢?既然我們已經(jīng)找到了兩幅圖像之間的一組匹配,我們當(dāng)然可以直接通過任何現(xiàn)有的方法(我提議使用RANSAC)找到一個(gè)同構(gòu)轉(zhuǎn)換來執(zhí)行映射,但讓我們了解一下我們正在做什么(見圖6)。如果需要,你可以跳過以下部分(在圖10之后繼續(xù)閱讀),因?yàn)槲抑粫?huì)解釋我們將要估計(jì)的轉(zhuǎn)換背后的原因。 我們所擁有的是一個(gè)具有已知坐標(biāo)的對象(在這種情況下是一個(gè)平面),比方說世界坐標(biāo)系,我們用位于相對于世界坐標(biāo)系的特定位置和方向的攝像機(jī)拍攝它。我們假定相機(jī)遵循針孔模型工作,這大致意味著穿過3D點(diǎn)p和相應(yīng)的2D點(diǎn)u的光線相交于攝像機(jī)的中心c。如果你有興趣了解更多關(guān)于針孔模型的知識(shí),這里有一個(gè)好的資源。 幸運(yùn)的是,由于參考面的點(diǎn)的z坐標(biāo)始終等于0(參考圖5),我們可以簡化上面發(fā)現(xiàn)的轉(zhuǎn)換。很容易看出,z坐標(biāo)和投影矩陣的第三列的乘積將是0,所以我們可以將該列和z坐標(biāo)從前面的等式中刪除。將校準(zhǔn)矩陣重命名為A,并考慮到外部校準(zhǔn)矩陣是齊次變換: |
|