2011-03-04 101 views
6

我試圖用OpenCV和SURF方法實現交通標誌識別器。我的問題是,我得到隨機結果(有時真的很準確,有時顯然是錯誤的),我不知道爲什麼。這裏是我是如何實現的比較:與SURF比較奇怪的結果

  • 首先我檢測輪廓我的形象上
  • 然後在每一個輪廓,我使用SURF找出如果交通標誌是內部和交通標誌

輪廓檢測工作得很好:使用gaussain模糊和Canny邊緣我設法找到類似這樣的輪廓:

enter image description here

然後我提取對應於該輪廓圖像與我此圖片交通標誌模板圖像進行比較,如這些:

enter image description here

enter image description here

的cvExtractSURF返回189個描述符的輪廓圖像。然後我使用naiveNearestNeighbor方法找出我的輪廓圖像和每個模板圖像之間的相似性。

這裏是我的結果:

189分之6第一個模板(這是一個我期待找到)

189分之92第二模板(這是顯然在各方面的輪廓圖像)

我真的不理解這些結果非常不同......

下面是步驟我每列表形式:

  • 打開灰度
  • 輪廓圖像轉灰度
  • 模板圖像均衡輪廓圖像的直方圖(cvEqualizeHist)
  • 調整模板圖像,使其輪廓圖像匹配
  • 模糊模板圖像(cvSmooth)
  • 模糊的輪廓圖像(cvSmooth)
  • 請在模板伊馬一個cvExtractSURF GE
  • 輪廓圖像
  • 上做一個cvExtractSURF對於每一個描述符Ø輪廓像我做了naiveNearestNeighbor
  • 我店的「好」的點數

爲了評估2之間的相似性圖像I使用比率:描述符

數目的goog點/總數

PS:對於信息I,接着這個教程:http://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp

而且使用的OpenCV的find_obj樣品,以使其適應在C.

回答

6

SURF描述符都很好,比較豐富的紋理圖像...我認爲這是沒有紋理的交通標誌對他們來說足夠了。

提取描述符時,首先找到「顯着點」,例如,在您的情況下,在兩個符號(矩形和字母P)上的矩形標記的拐角處,然後收集局部屬性。就像一個矩形的角落看起來像從近處模糊和灰度。

然後,這些描述符被匹配到字母P的矩形的角落。它們並不完全相同......(因爲我們沒有考慮任何形狀信息)。也許字母P的角落更接近於「禁止進入」標誌的角落。隨機。

當然,所有這些只是一個猜測......唯一的解決方法是徹底調試它。嘗試用小圓圈顯示描述符被找到的圖像(圓圈大小可能取決於發現的點的比例)。或者將兩個圖像放入一個IplImage中,並在匹配描述符之間畫線。事情是這樣的:

http://www.flickr.com/photos/[email protected]/268039276

至於如何解決這個問題?怎麼樣使用您用於檢測外部輪廓的交通標誌內部相同的形狀匹配方法? (例如,你可以看看對於P形物件一旦符號被發現。)

+2

我知道這是一個古老的答案,但它幫助我避免使用SURF進行圖像匹配應用程序,其中我有類似質感差的圖像。對於這些圖像上的特徵提取和比較的良好通用算法有何建議? – rkagerer 2012-02-05 22:05:43

+0

很好的問題,我也會對這樣的算法感興趣:)(我認爲這會產生一個很好的頂級問題) – Latanius 2012-02-25 14:41:07

0

爲了評價2個圖像之間的相似性我使用比例爲:描述符 數目的goog點/總數

我認爲這是一個不好的指標,您需要使用基於描述符向量的度量標準,並且您必須使用點之間的spartial信息。

這是因爲類似SIFT的特徵只匹配「相同點」但不相似的點,也許你可以通過改變匹配標準來調整它。因爲在opencv匹配標準中得到最近點(通過描述符)並檢查是否存在是近似0.6的另一個描述符。

描述符匹配包括兩個步驟。第一步遵循David Lowe簡單但強大的匹配算法。更確切地說,要查看左圖中的描述符A是否與右圖中的某個描述符匹配,我們首先計算左圖中的描述符A與所有描述符A之間的歐幾里德距離d(A,A') '在正確的形象。如果最近的距離,比如d(A,A1')小於第二個最近距離的k倍,比如d(A,A2'),那麼A和A1'被認爲是匹配的。我們設置k = 0.6

也許你可以改變k,但我認爲它會給出更多的誤報。