2015-04-06 67 views
2

我嘗試通過它們的顏色和形狀來檢測交通標誌,我從de顏色分割中獲得二值圖像,並嘗試檢測其中的三角形,除非三角形的所有邊都完整ÿ不工作,檢測不完整/完美的三角形

在這個圖像中,例如它沒有檢測到任何三角形

enter image description here

我使用的代碼是這樣的:

vector<Point> approx; 
    findContours(copia,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE); 
    vector<Rect_ <int> > boundRect(contours.size()); 
    vector<Rect_ <int> > boundRect_(contours.size()); 
    for(size_t i=0; i<contours.size();i++) 
    { 

     approxPolyDP(Mat(contours[i]), approx,arcLength(Mat(contours[i]), true)*0.02, true); 

     if (approx.size() == 3 &&fabs(contourArea(Mat(approx))) > 300 && isContourConvex(Mat(approx))) 
      drawContours(capture->image,contours,i,Scalar(0,255,0)); 

這不是cotourArea的問題,我沒有問題檢測完整的三角形。我不知道我是否可以做一些事情來檢測那種「不完整的三角形」,或者我將不得不做一些事情來完成三角形,以便我可以檢測到它們。在這兩種情況下,我有點失落

謝謝您的幫助

編輯:我忘了上傳圖片

回答

1

其實,三角形在視覺方面也許很難的OpenCV的一面,但我會建議一些可能會幫助你實現的方法。

1)使用檢測器角

OpenCV Canny)到檢測器的二值圖像中的所有角落。我會說使用形態學操作(Dilate and Errode)作爲減少噪音而不是模糊或非最大抑制的手段。下一步使用極端點,並將其連接起來形成三角形。因爲可能會有很多彎道,您可以嘗試擬合所有的點並選擇最大的Fit。你也可以使用delaunay三角測量法來找到三角形的點。

2)使用曲率信息。 由於三角形的一條邊缺失,因此可以使用2條邊來計算外接輪廓的曲率。在這裏,形態操作(Dilate and Errode)也是有用的。比你可以選擇點曲率(Computing the Curvature of Binary Image Contour)作爲頂點的極端點,並擬合線來逼近三角形。如果你的圖像不太不精確,你可以使用Convex Hull來獲得近似值。

3)RANSAC擬合 也可以使用擬合方法通過使用三角形的變體來近似的三角形,它適合於二進制圖像上的2個估計邊緣。

+0

我試圖做凸起,它檢測到更多的三角形(當雙方的某些部分失蹤它有時仍然失敗),但現在我得到了很多圖像中的誤報,在沒有任何遙遠相似的地方到一個三角形 我會嘗試使用曲率檢測,關於RANSAC我不太清楚那是什麼,我沒有找到一個好的教程,你能告訴我在哪裏可以學到更多的知識嗎? – Kailegh 2015-04-13 15:19:38

1

主題很舊 - 但可能有助於他人。 我有同樣的問題,但我在輸入圖像上使用dilate()函數處理它(如果三角形有較大間隙,它可能需要2-3次迭代)。這不是最好的解決方案,但目前似乎是最容易的解決方案。