2014-03-02 78 views
3

我一直在玩GPUImage庫,它實現了幾個特徵探測器:Harris,FAST,ShiTomas,Noble。然而,這些實現中沒有一個有助於特徵提取和匹配部分。他們只是輸出一組檢測到的角點。基於GPU的SIFT特徵提取器適用於iOS?

我的理解(這是shakey)是,下一步是檢查每個檢測到的角點並從中提取特徵,這將導致描述符 - 即32位或64位數字,可能是用於索引其他類似點附近的點。

從閱讀[計算機視覺算法和應用,Szeliski]的4.1章節,我明白使用BestBin方法將有助於高效地找到相鄰的特徵來匹配,等等。但是,我實際上並不知道如何做到這一點我正在尋找一些這樣做的示例代碼。

我發現這個項目[https://github.com/Moodstocks/sift-gpu-iphone],聲稱儘可能多地實現GPU中的特徵提取。我也看到一些討論表明它可能會產生錯誤的描述符。

在任何情況下,該代碼都不會顯示如何將提取的特徵與其他圖像進行最佳匹配。

我的用例,如果試圖找到圖像中的對象。

有沒有人有這樣做的代碼,或至少一個很好的實現,顯示如何提取的功能匹配?我希望不必重寫整套算法。

謝謝, Rob。

回答

2

首先,您需要小心SIFT的實施,因爲the SIFT algorithm is patented和這些專利的所有者需要使用許可費。我故意避免使用該算法作爲結果。

尋找在GPU上運行良好的良好特徵檢測和提取方法有點棘手。 GPUImage中的Harris,Shi-Tomasi和Noble角檢測器都是相同基本操作的衍生產品,可能不是識別特徵的最快方法。

正如您所看到的,我的FAST角點檢測器尚未運行。我們的想法是使用基於本地二進制模式的查找紋理(爲什麼我首先構建了這個過濾器來測試這個概念),然後讓它返回它是否是角點。這應該比Harris等角落探測器快得多。我還需要完成我的直方圖金字塔點提取器,以便在GPU上以極慢的循環完成特徵提取。

對於FAST角落探測器的查找紋理的使用受Jaco Cronje的this paper的啓發,他們稱之爲BFROST。除了使用快速,基於紋理的查找功能進行特徵檢測之外,本文還提出將二進制模式用作特徵的快速描述符。除此之外還有一點,但總的來說,這就是他們的建議。

功能匹配是由海明距離完成的,但雖然有快速的CPU端和CUDA指令來計算,但OpenGL ES沒有。那裏可能需要一個不同的方法。同樣,我沒有一個很好的解決方案來尋找CPU端以外的功能組之間的最佳匹配,但我還沒有想到。

我的這個主要目標是在框架中(這是我構建它的原因之一),但我最近沒有時間去處理這個問題。以上至少是我關於如何處理這個問題的想法,但我警告你,這不易實施。

+0

是的,我已經等了以下工作在GPUImage項目爲好,曳那些票一樣,所以我找到了有關實現快速檢票。 作爲下一步(嬰兒)步驟,我注意到當前的檢測器不提取特徵。它看起來像他們需要將他們的輸出饋送到另一個創建描述符併爲其編制索引的過濾器。 在這一點上,我認爲我可以在CPU中執行算法,因爲我只處理數百個特徵,而不是數千個特徵。你認爲這是明智的嗎? – Rob

+0

你見過這個圖書館嗎? https://www.vuforia.com/platform。似乎也使用OpenGL檢測圖像中的對象。顯然免費,不收費。 – Rob

0

對於目標識別/最近(最近幾周前)最好使用tensorflow /卷積神經網絡。 蘋果有一些最近添加的金屬示例代碼。 https://developer.apple.com/library/content/samplecode/MetalImageRecognition/Introduction/Intro.html#//apple_ref/doc/uid/TP40017385

要在圖像中進行特徵檢測 - 我將您的注意力引入開箱即用 - 帶有opencv的KAZE/AKAZE算法。 http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html

對於ios,我將Akaze類與另一個拼接樣本粘在一起以說明。

detector = cv::AKAZE::create(); 
detector->detect(mat, keypoints); // this will find the keypoints 

cv::drawKeypoints(mat, keypoints, mat); 

// this is the pseudo SIFT descriptor 
.. [255] = { 
pt = (x = 645.707153, y = 56.4605064) 
size = 4.80000019 
angle = 0 
response = 0.00223364262 
octave = 0 
class_id = 0 } 

https://github.com/johndpope/OpenCVSwiftStitch

enter image description here