2017-03-05 204 views
3

我正在嘗試檢測交通標誌的區域。使用OpenCV的,我的做法如下:從圖像中檢測三角形,橢圓和矩形

彩色圖像:

enter image description here

使用TanTriggs Preprocessing擺脫照明的方差:

enter image description here

均化直方圖:

enter image description here

而雙穩態(Cv2.Threshold(blobs, blobs, 127, 255, ThresholdTypes.BinaryInv)

enter image description here

迭代每個斑使用blob作爲掩模使用ConnectedComponentsget the mean color value。如果它是紅色,那麼它可能是一個紅色標誌。

然後使用FindContours獲得此Blob的輪廓。

簡化使用ApproxPolyDP輪廓,並檢查每個輪廓的點:然後

  • 如果3點的三角形形狀是可接受的 - >候選三角徵
  • 如果4個點然後形狀是可接受的 - >候選
  • 如果超過4分,BBOX尺寸是可接受的,並且大部分點都在裝配在橢圓(FitEllipse) - >候選

這種方法適用於二進制圖像中的分離斑點,如我的示例中的圓形100km符號。但是,如果存在與外部對象的連接,如二進制圖像中的三角形左下部分,則會失敗。

enter image description here

因爲,這種斑點的平均值是遠遠紅!

在某些情況下使用Erosion會有所幫助,但會使其在許多其他圖像中變得更糟。

對二值化使用不同的閾值也適用於某些,但在許多方面失敗;像侵蝕。

使用HoughCircle只是非常慢,我不能設法得到好的結果玩參數。

我嘗試過使用matchShapes,但無法獲得好的結果。

任何人都可以告訴我另一種方式實現我想要的(具有合理的計算時間)嗎?

任何信息或任何語言的代碼都是很好的。

編輯: 使用circularity measureC=P^2/4πA)或方法我已如上所述,三角形和橢圓。形狀可它們被分離時被發現。然而,當輪廓是這樣的例如: enter image description here

我找不到一個可靠的方式來提取三角形片。如果可以,我會檢查平均顏色,並決定它是否是紅色標誌候選者。

+1

您是否嘗試過形態學開放(侵蝕+擴張)而不是侵蝕?它可以幫助消除嘈雜的連接,同時保留最初固體連接的組件。 – kazarey

+0

是的,我嘗試了不同的內核類型和大小。侵蝕 - 擴張,擴張 - 侵蝕等一般成功總是減少。也嘗試了一些模糊(高斯,pyrdown等),這也減少了成功。 – Koray

+1

是否可以讓機器學習適用於該任務?如果你擁有一些交通標誌學習基地,你可以訓練哈爾級聯或神經網絡爲你做標誌檢測。 – kazarey

回答

1

對不起,我沒有評論的榮譽,但不能使用紅色?

import common 
myshow = common.myshow 

img = cv2.imread("ms0QB.png") 
grey = np.zeros(img.shape[:2],np.uint8) 
hsv = cv2.cvtColor(img,cv2.COLOR_mask = np.logical_or(hsv[:,:,0]>160,hsv[:,:,0]<10) 
grey[mask] = 255 
cv2.imshow("160<hue<182",grey) 
cv2.waitKey() 
+0

這是一個好主意。其實,我的應用程序有一些迭代來尋找ROI。對於HSV,我使用minH = 169; maxH = 7; minS = 0; maxS = 40; minV = 230; maxV = 30。另一個迭代基於LAB顏色,另外兩個基於Hasan Fleyeh關於分割的論文。我研究了這些在某些情況下可能不成功(霧,日落照明)我也試圖找到其他顏色的標誌,包括白黑色的標誌。我正在尋找是否可以用TanTriggs預處理僅在一個迭代中解決所有顏色;並提高性能。 – Koray