之前在《淺談移動(dòng)平臺(tái)創(chuàng)新玩法》簡單的猜測了easyar中使用的圖像識(shí)別算法晓锻,基于圖片指紋的哈希算法的圖片檢索 砚哆。后再阿里引商大神的指點(diǎn)下,意識(shí)到圖片檢測只適用于靜態(tài)圖片的識(shí)別躁锁,只能做AR脫卡(不進(jìn)行圖像追蹤),簡單地說就是如果圖片有角度翻轉(zhuǎn)战转,光線明暗的變化都會(huì)改變圖片自身的指紋哈希值搜立,無法做到跟蹤識(shí)別。那要如何進(jìn)行跟蹤識(shí)別呢槐秧?
引商的指點(diǎn):我們用的是akaze啄踊,整個(gè)匹配流程采用的是基于特征提取加kmeans樹求近似最近鄰匹配的算法,然后再對(duì)匹配到的關(guān)鍵點(diǎn)對(duì)求單應(yīng)性映射刁标,最后根據(jù)inlier點(diǎn)集進(jìn)行打分的方式來最終判定識(shí)別到的目標(biāo)颠通。
圖像特征
和圖像指紋類似,能夠唯一標(biāo)示膀懈,區(qū)別于其他圖像的“有趣部分”。一個(gè)很抽象的概念,它的精確定義往往由具體問題或應(yīng)用類型來決定撵儿。可重復(fù)檢測性是圖像特征最重要的特性:同一圖像無論發(fā)生角度乘客,位移,明暗變化淀歇,所提取的特征應(yīng)該是相同的易核。圖像特征是許多計(jì)算機(jī)圖像分析算法的起點(diǎn),因此一個(gè)算法是否成功往往由它使用和定義的特征決定浪默。
常用的圖像特征有顏色特征牡直,紋理特征,形狀特征纳决,空間關(guān)系特征碰逸。
顏色特征,是一種全局特征阔加,描述了圖像或圖像區(qū)域所對(duì)應(yīng)景物的表面性質(zhì)饵史。例如灰度直方圖等。
紋理特征胜榔,是一種全局特征胳喷,描述了圖像或圖像區(qū)域所對(duì)應(yīng)景物的表面性質(zhì)。例如基于共生矩陣的熵夭织、角二階矩和局部平穩(wěn)性等吭露。
形狀特征,是一種局部特征尊惰,描述了局部區(qū)域內(nèi)物體的外形性質(zhì)讲竿。例如邊界特征等。
空間關(guān)系特征弄屡,是指圖像中分割出來的多個(gè)目標(biāo)之間的相互的空間位置或相對(duì)方向關(guān)系题禀。這些關(guān)系也可分為連接/鄰接關(guān)系、交疊/重復(fù)關(guān)系和包含/包容關(guān)系等膀捷。
特征被檢測后它可以從圖像中被提取出來迈嘹。這個(gè)過程可能需要許多圖像處理的計(jì)算(如大名鼎鼎的計(jì)算機(jī)視覺圖像處理庫OpenCV)。其結(jié)果被稱為特征描述或者特征向量担孔。
AKAZE特征提取算法
KAZE是 Pablo F. Alcantarilla江锨,Adrien Bartoli和Andrew J. Davison2012年在ECCV2012[ECCV是計(jì)算機(jī)視覺領(lǐng)域最頂尖的三個(gè)會(huì)議(CVPR吃警、 ECCV糕篇, ICCV)之一,每兩年一次]中提出來的一種比SIFT酌心、SURF(OpenCV 2.4.9版本中實(shí)現(xiàn)的圖像特征檢測算法)更穩(wěn)定拌消、性能更好的特征檢測算法。
KAZE特征檢測是在圖像域中進(jìn)行非線性擴(kuò)散處理的過程。KAZE算法的作者提出采用加性算子分裂算法(Additive Operator Splitting, AOS)來進(jìn)行非線性擴(kuò)散濾波墩崩,可以采用任意步長來構(gòu)造穩(wěn)定的非線性尺度空間氓英。
AKAZE 是加速版KAZE特征,即Accelerated KAZE Features鹦筹。作者基于OpenCV實(shí)現(xiàn)了Akaze算法的代碼铝阐,在項(xiàng)目主頁(http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html)可以下載到完整的實(shí)現(xiàn)源代碼,具體使用中可以下載OpenCV 3.0及以上版本直接調(diào)用Akaze算法類(http://docs.opencv.org/3.0-beta/doc/tutorials/features2d/akaze_matching/akaze_matching.html)铐拐。
K-Meas算法
在數(shù)據(jù)挖掘中徘键,K-Means 算法是一種聚類分析的算法。K-Means聚類的目的是:把n個(gè)點(diǎn)(可以是樣本的一次觀察或一個(gè)實(shí)例)劃分到k個(gè)聚類中遍蟋,使得每個(gè)點(diǎn)都屬于離他最近的均值(此即聚類中心)對(duì)應(yīng)的聚類吹害,以之作為聚類的標(biāo)準(zhǔn)。
K-Means算法主要解決的問題:我們可以看到虚青,在圖的左邊有一些點(diǎn)它呀,我們用肉眼可以看出來有四個(gè)點(diǎn)群,但是我們?cè)趺赐ㄟ^計(jì)算機(jī)程序找出這幾個(gè)點(diǎn)群來呢棒厘?于是就出現(xiàn)了我們的K-Means算法纵穿。
例如在互聯(lián)網(wǎng)金融公司的借貸業(yè)務(wù)中,給你1000000個(gè)用戶绊谭,需要按金融產(chǎn)品種類分成n個(gè)人群政恍,每一群人都有各自的“突出特征”(類似圖像特征),以便區(qū)分出來他們都能適用哪一類產(chǎn)品达传,幫助金融公司合理規(guī)避借貸風(fēng)險(xiǎn)篙耗,這就是互聯(lián)網(wǎng)金融公司基于大數(shù)據(jù)分析風(fēng)控系統(tǒng)的基本原理。
這么解釋K-Means算法是不是就容易理解多了宪赶。
單應(yīng)性
單應(yīng)性是幾何中的一個(gè)概念宗弯,是一個(gè)從實(shí)射影平面到射影平面的可逆變換,直線在該變換下仍映射為直線搂妻。具有相同意義的詞還包括直射變換蒙保、射影變換和射影性等。在計(jì)算機(jī)視覺領(lǐng)域中欲主,空間中同一平面的任意兩幅圖像可以通過單應(yīng)性關(guān)聯(lián)在一起邓厕。比如一個(gè)物體可以通過旋轉(zhuǎn)相機(jī)鏡頭獲取兩張不同的照片(這兩張照片的內(nèi)容不一定要完全對(duì)應(yīng),部分對(duì)應(yīng)即可)扁瓢,我們可以把單應(yīng)性設(shè)為一個(gè)二維矩陣M详恼,那么照片1乘以M就是照片2。這有著很多實(shí)際應(yīng)用引几,比如圖像校正昧互、圖像對(duì)齊或兩幅圖像之間的相機(jī)運(yùn)動(dòng)計(jì)算(旋轉(zhuǎn)和平移)等。
在數(shù)學(xué)里齊次坐標(biāo),或投影坐標(biāo)是指一個(gè)用于投影幾何里的坐標(biāo)系統(tǒng)敞掘,如同用于歐氏幾何里的笛卡兒坐標(biāo)一樣叽掘。如果點(diǎn)Q到成像儀上的點(diǎn)q的映射使用齊次坐標(biāo),這種映射可以用矩陣相乘的方式表示玖雁。若有一下定義:
則可以將單應(yīng)性簡單的表示為:
這里引入?yún)?shù)s更扁,它是任意尺度的比例(目的是使得單應(yīng)性定義到該尺度比例)。H有兩部分組成:用于定位觀察的物體平面的物理變換和使用攝像機(jī)內(nèi)參數(shù)矩陣的投影赫冬。
物理變換部分是與觀測到的圖像平面相關(guān)的部分旋轉(zhuǎn)R和部分平移t的影響之和疯潭,表示如下:
這里R為3*3大小的矩陣,t表示一個(gè)3維的列矢量面殖,攝像機(jī)內(nèi)參數(shù)矩陣用M表示竖哩,那么我們重寫單應(yīng)性如下:
單應(yīng)性研究的是一個(gè)平面上到另外一個(gè)平面的映射,那么上述公式中的Q脊僚,就可以簡化為平面坐標(biāo)中的Q'相叁,即我們使Z=0。即物體平面上的點(diǎn)我們用x,y表示辽幌,相機(jī)平面上的點(diǎn)增淹,我們也是用二維點(diǎn)表示。我們?nèi)サ袅薢方向的坐標(biāo)乌企,那么相對(duì)于旋轉(zhuǎn)矩陣R虑润,R可以分解為R=[r1 r2 r3],那么r3也就不要了加酵,參考下面的推導(dǎo):
其中H為:
是一個(gè)3×3大小的矩陣拳喻,故最終的單應(yīng)性矩陣可表示如下:
OpenCV就是利用上述公式來計(jì)算單應(yīng)性矩陣。它使用同一物體的多個(gè)圖像來計(jì)算每個(gè)視場的旋轉(zhuǎn)和平移猪腕,同時(shí)也計(jì)算攝像機(jī)的內(nèi)參數(shù)冗澈。
inlier點(diǎn)集驗(yàn)證
K-Means算法解決了圖像特征聚類分析的問題,現(xiàn)在需要解決驗(yàn)證的問題 陋葡。OpenCV中有很多種匹配算法SIFT亚亲、ORB、RANSAC等算法腐缤,這里只說比較有名的RANSAC算法捌归。RANSAC算法是一種簡單且有效的去除噪聲影響,估計(jì)模型的一種方法岭粤。與普通的去噪算法不同惜索,RANSAC算法是使用盡可能少的點(diǎn)來估計(jì)模型參數(shù),然后盡可能的擴(kuò)大得到的模型參數(shù)的影響范圍绍在。
RANSAC算法的具體描述是:給定N個(gè)數(shù)據(jù)點(diǎn)組成的集合P门扇,假設(shè)集合中大多數(shù)的點(diǎn)都是可以通過一個(gè)模型來產(chǎn)生的,且最少通過n個(gè)點(diǎn)(n<N)可以擬合出模型的參數(shù)偿渡,則可以通過以下的迭代方式擬合該參數(shù)臼寄。
對(duì)下面的操作執(zhí)行k次:
(1)從P中隨機(jī)選擇n個(gè)數(shù)據(jù)點(diǎn);
(2)用這n個(gè)數(shù)據(jù)點(diǎn)擬合出一個(gè)模型M溜宽;
(3)對(duì)P中剩余的數(shù)據(jù)點(diǎn)吉拳,計(jì)算每個(gè)點(diǎn)與模型M的距離,距離超過閾值的則認(rèn)定為局外點(diǎn)(及outlier點(diǎn))适揉,不超過閾值的認(rèn)定為局內(nèi)點(diǎn)(及inlier點(diǎn))留攒,并記錄該模型M所對(duì)應(yīng)的局內(nèi)點(diǎn)的值m;
迭代k次以后嫉嘀,選擇m最大的模型M作為擬合的結(jié)果炼邀。
因?yàn)樵趯?shí)際應(yīng)用中N的值通常會(huì)很大,那么從其中任選n個(gè)數(shù)據(jù)點(diǎn)的組合就會(huì)很大剪侮,如果對(duì)所有組合都進(jìn)行上面的操作運(yùn)算量就會(huì)很大拭宁,因此對(duì)于k的選擇就很重要。通常情況下瓣俯,只要保證模型估計(jì)需要的n個(gè)點(diǎn)都是點(diǎn)的概率足夠高即可杰标。因此設(shè)w為N個(gè)數(shù)據(jù)中局內(nèi)點(diǎn)的比例,z為進(jìn)行k次選取后彩匕,至少有一次選取的n個(gè)點(diǎn)都是局內(nèi)點(diǎn)的概率腔剂。則有
其中 1?wn 表示一次選取不都是局內(nèi)點(diǎn)的概率,(1?wn)k 表示k次選取中沒有一次都是局內(nèi)點(diǎn)的概率驼仪。 則有:
這里z一般要求滿足大于95%即可掸犬。
至此一個(gè)完整的AR識(shí)別追蹤流程原理分析完畢,后續(xù)就是OpenCV源碼研究绪爸。