2012-07-23 29 views
9

假設您有兩張圖像。在一個你有一個小圖標(像小於300X300像素)。第二個是非常大的一個,並且在內部有一個(或多個)較小的圖標實例(當然是以不同的比例旋轉)。特徵檢測 - 大圖中的小物品

手頭的任務是在大圖中找到圖標的實例。你們如何處理這個問題?

我試圖使用基於特徵的對象檢測,通過使用OpenCV庫,但對於擁擠的大圖像(包含許多特徵點),匹配是不確定的。我已經使用BRUTE/FLAN匹配算法嘗試了SURF/OBJ特徵提取器。

從我的經驗看來,匹配似乎沒有注意到兩個圖像上的特徵點之間的幾何關係。作爲可視化幫助,我附加了兩個示例圖像的特徵點實例。 enter image description here

這是一個更難的任務實例。我已經在大圖中突出顯示了這個圖標。 enter image description here

+1

你似乎有一個相當獨特的顏色。您可以嘗試兩個階段的過程,首先使用斑點檢測搜索該顏色,然後找到其特徵檢測限於該區域以擺脫誤報的姿勢。當然,如果圖像中太多的其他部分是鮮紅的,那就完全失敗了...... – Hammer 2012-07-23 22:10:27

回答

4

基於有限的經驗,對於遇到此類問題的其他人,我有三條建議。

1)實驗用FindObject by Mathieu Labbé

這是一個非常好的工具,可以幫助我快速試驗來找到爲特徵檢測/描述設置好的組合。只需將您的圖標加載爲對象並將樣本大圖像加載爲場景即可。然後調整,直到您獲得可靠的結果爲您的應用程序。作爲獎勵,他最近添加了BRISK和FREAK非專利功能檢測/描述方法。

2)獲得一個現實的

分辨率是您的圖標對象,並在大場面,你正在尋找實際的圖標,使不同。根據我的理解,這些方法的尺度不變性實際上非常有限。看看出色的comparisons done by Ievgen Khvedchenia。通過將圖像調整到您期望的範圍的中間,您可能會獲得更好的效果。

3)使圖標樣本圖像更逼真(例如,模糊)

相關#2,我已經發現,具有在一個更真實的場景搜索時非常尖銳的樣本圖像不工作得很好。我對尖銳的樣本應用了高斯函數,以使它們與我期望找到的更相似。下面有一個例子。奇怪的公式只是確保內核維度是需要的奇數。

def proportional_gaussian(image): 
    kernel_proportion = 0.005 
    kernel_w = int(2.0 * round((image.shape[1]*kernel_proportion +1)/2.0)-1) 
    kernel_h = int(2.0 * round((image.shape[0]kernel_proportion +1)/2.0)-1) 
    return cv2.GaussianBlur(image, (kernel_w, kernel_h), 0) 

希望能幫助別人。

2

您的功能匹配方法很好。如果可以使用顏色,請使用預處理來查找感興趣的區域,如histogram backprojection,然後進行斑點提取和一些形狀分析。

您應該匹配從大圖像到小圖像的所有特徵。這導致了許多與內部人數少的比賽。

由於您的圖標是平面的,因此您可以使用單應作爲您的匹配的幾何約束。 不寫一行代碼,你可以嘗試OpenCV示例「descriptor_extractor_matcher」,它可以在OpenCV源文件的samples目錄中找到。

./descriptor_extractor_matcher SURF SURF BruteForce NoneFilter icon.jpg image.jpg 3 

請參閱descriptor_extractor_matcher的幫助輸出瞭解更多詳細信息。

你可能會嘗試切換圖像的順序,我不記得哪一個是訓練圖像,哪一個是查詢圖像。

紙對這種目標的檢測是通過大衛·羅伊「從尺度不變關鍵點鮮明的形象特徵。」在本文第7.3節中,他描述了他處理非常低的內點/外點比例的方法,這似乎是你的情況。

祝你好運!