之前在《淺談移動平臺創新玩法》簡單的猜測了easyar中使用的圖像識別算法,基于圖片指紋的哈希算法的圖片檢索 。后再阿里引商大神的指點下,意識到圖片檢測只適用于靜態圖片的識別,只能做AR脫卡(不進行圖像追蹤),簡單地說就是如果圖片有角度翻轉,光線明暗的變化都會改變圖片自身的指紋哈希值,無法做到跟蹤識別。那要如何進行跟蹤識別呢?
引商的指點:我們用的是akaze,整個匹配流程采用的是基于特征提取加kmeans樹求近似最近鄰匹配的算法,然后再對匹配到的關鍵點對求單應性映射,最后根據inlier點集進行打分的方式來最終判定識別到的目標。
圖像特征
和圖像指紋類似,能夠唯一標示,區別于其他圖像的“有趣部分”。一個很抽象的概念,它的精確定義往往由具體問題或應用類型來決定。可重復檢測性是圖像特征最重要的特性:同一圖像無論發生角度,位移,明暗變化,所提取的特征應該是相同的。圖像特征是許多計算機圖像分析算法的起點,因此一個算法是否成功往往由它使用和定義的特征決定。
常用的圖像特征有顏色特征,紋理特征,形狀特征,空間關系特征。
顏色特征,是一種全局特征,描述了圖像或圖像區域所對應景物的表面性質。例如灰度直方圖等。
紋理特征,是一種全局特征,描述了圖像或圖像區域所對應景物的表面性質。例如基于共生矩陣的熵、角二階矩和局部平穩性等。
形狀特征,是一種局部特征,描述了局部區域內物體的外形性質。例如邊界特征等。
空間關系特征,是指圖像中分割出來的多個目標之間的相互的空間位置或相對方向關系。這些關系也可分為連接/鄰接關系、交疊/重復關系和包含/包容關系等。
特征被檢測后它可以從圖像中被提取出來。這個過程可能需要許多圖像處理的計算(如大名鼎鼎的計算機視覺圖像處理庫OpenCV)。其結果被稱為特征描述或者特征向量。
AKAZE特征提取算法
KAZE是 Pablo F. Alcantarilla,Adrien Bartoli和Andrew J. Davison2012年在ECCV2012[ECCV是計算機視覺領域最頂尖的三個會議(CVPR、 ECCV, ICCV)之一,每兩年一次]中提出來的一種比SIFT、SURF(OpenCV 2.4.9版本中實現的圖像特征檢測算法)更穩定、性能更好的特征檢測算法。
KAZE特征檢測是在圖像域中進行非線性擴散處理的過程。KAZE算法的作者提出采用加性算子分裂算法(Additive Operator Splitting, AOS)來進行非線性擴散濾波,可以采用任意步長來構造穩定的非線性尺度空間。
AKAZE 是加速版KAZE特征,即Accelerated KAZE Features。作者基于OpenCV實現了Akaze算法的代碼,在項目主頁(http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html)可以下載到完整的實現源代碼,具體使用中可以下載OpenCV 3.0及以上版本直接調用Akaze算法類(http://docs.opencv.org/3.0-beta/doc/tutorials/features2d/akaze_matching/akaze_matching.html)。
K-Meas算法
在數據挖掘中,K-Means 算法是一種聚類分析的算法。K-Means聚類的目的是:把n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬于離他最近的均值(此即聚類中心)對應的聚類,以之作為聚類的標準。
K-Means算法主要解決的問題:我們可以看到,在圖的左邊有一些點,我們用肉眼可以看出來有四個點群,但是我們怎么通過計算機程序找出這幾個點群來呢?于是就出現了我們的K-Means算法。
例如在互聯網金融公司的借貸業務中,給你1000000個用戶,需要按金融產品種類分成n個人群,每一群人都有各自的“突出特征”(類似圖像特征),以便區分出來他們都能適用哪一類產品,幫助金融公司合理規避借貸風險,這就是互聯網金融公司基于大數據分析風控系統的基本原理。
這么解釋K-Means算法是不是就容易理解多了。
單應性
單應性是幾何中的一個概念,是一個從實射影平面到射影平面的可逆變換,直線在該變換下仍映射為直線。具有相同意義的詞還包括直射變換、射影變換和射影性等。在計算機視覺領域中,空間中同一平面的任意兩幅圖像可以通過單應性關聯在一起。比如一個物體可以通過旋轉相機鏡頭獲取兩張不同的照片(這兩張照片的內容不一定要完全對應,部分對應即可),我們可以把單應性設為一個二維矩陣M,那么照片1乘以M就是照片2。這有著很多實際應用,比如圖像校正、圖像對齊或兩幅圖像之間的相機運動計算(旋轉和平移)等。
在數學里齊次坐標,或投影坐標是指一個用于投影幾何里的坐標系統,如同用于歐氏幾何里的笛卡兒坐標一樣。如果點Q到成像儀上的點q的映射使用齊次坐標,這種映射可以用矩陣相乘的方式表示。若有一下定義:
則可以將單應性簡單的表示為:
這里引入參數s,它是任意尺度的比例(目的是使得單應性定義到該尺度比例)。H有兩部分組成:用于定位觀察的物體平面的物理變換和使用攝像機內參數矩陣的投影。
物理變換部分是與觀測到的圖像平面相關的部分旋轉R和部分平移t的影響之和,表示如下:
這里R為3*3大小的矩陣,t表示一個3維的列矢量,攝像機內參數矩陣用M表示,那么我們重寫單應性如下:
單應性研究的是一個平面上到另外一個平面的映射,那么上述公式中的Q,就可以簡化為平面坐標中的Q',即我們使Z=0。即物體平面上的點我們用x,y表示,相機平面上的點,我們也是用二維點表示。我們去掉了Z方向的坐標,那么相對于旋轉矩陣R,R可以分解為R=[r1 r2 r3],那么r3也就不要了,參考下面的推導:
其中H為:
是一個3×3大小的矩陣,故最終的單應性矩陣可表示如下:
OpenCV就是利用上述公式來計算單應性矩陣。它使用同一物體的多個圖像來計算每個視場的旋轉和平移,同時也計算攝像機的內參數。
inlier點集驗證
K-Means算法解決了圖像特征聚類分析的問題,現在需要解決驗證的問題 。OpenCV中有很多種匹配算法SIFT、ORB、RANSAC等算法,這里只說比較有名的RANSAC算法。RANSAC算法是一種簡單且有效的去除噪聲影響,估計模型的一種方法。與普通的去噪算法不同,RANSAC算法是使用盡可能少的點來估計模型參數,然后盡可能的擴大得到的模型參數的影響范圍。
RANSAC算法的具體描述是:給定N個數據點組成的集合P,假設集合中大多數的點都是可以通過一個模型來產生的,且最少通過n個點(n<N)可以擬合出模型的參數,則可以通過以下的迭代方式擬合該參數。
對下面的操作執行k次:
(1)從P中隨機選擇n個數據點;
(2)用這n個數據點擬合出一個模型M;
(3)對P中剩余的數據點,計算每個點與模型M的距離,距離超過閾值的則認定為局外點(及outlier點),不超過閾值的認定為局內點(及inlier點),并記錄該模型M所對應的局內點的值m;
迭代k次以后,選擇m最大的模型M作為擬合的結果。
因為在實際應用中N的值通常會很大,那么從其中任選n個數據點的組合就會很大,如果對所有組合都進行上面的操作運算量就會很大,因此對于k的選擇就很重要。通常情況下,只要保證模型估計需要的n個點都是點的概率足夠高即可。因此設w為N個數據中局內點的比例,z為進行k次選取后,至少有一次選取的n個點都是局內點的概率。則有
其中 1?wn 表示一次選取不都是局內點的概率,(1?wn)k 表示k次選取中沒有一次都是局內點的概率。 則有:
這里z一般要求滿足大于95%即可。
至此一個完整的AR識別追蹤流程原理分析完畢,后續就是OpenCV源碼研究。