2012-08-28 149 views
10

我正在研究形狀識別應用程序。此時,一組點(x,y)由角點檢測器確定(紅色點,img。2。)。其中四個點(紅框,img。2。)是矩形的頂點(有時是一個小變形的矩形)。找到他們最好的方法是什麼?如何檢查四個點是否形成矩形

下面是輸入圖像的一個例子: Input image

它看起來像該角檢測之後:

Image with detected corners

回答

11

這不是您的問題的答案 - 這僅僅是建議。

在我看來,角點檢測器是一種檢測矩形的不好方法 - 計算所有點距離需要很長時間,因爲建議使用數學家19075。你必須在這種情況下使用另一種技術:

  1. 這張郵票是紫羅蘭色,所以你應該做的第一件事就是色彩分割。
  2. 完成第1步之後,您可以使用Houhg transform來檢測二值圖像上的行。或者在圖像中查找所有輪廓。
  3. 最後一步是檢測矩形。

更新:

這裏的另一個解決方案,也應該在灰度圖像的工作。

  1. 執行的閾值圖像轉換爲1位(I使用從255作爲閾值)。
  2. 找到所有的面積比一些常量大的新圖像輪廓(我花了)。
  3. 找到包圍每個輪廓矩形,並做了檢查:

ContourArea/BoundingReactangleArea>恆

我藉此constant0.9

該算法給我一個結果: enter image description here

這裏的OpenCV的代碼:

Mat src = imread("input.jpg"), gray, result; 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 

result = Mat(src.size(), CV_8UC1); 

cvtColor(src, src, CV_BGR2GRAY); 
threshold(src, gray, 200, 255, THRESH_BINARY_INV); 
findContours(gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

result = Scalar::all(0); 
for (size_t i=0; i<contours.size(); i++) 
{ 
    Rect rect = boundingRect(contours[i]); 
    if (rect.area() > 1000) 
    { 
     double area = contourArea(contours[i]); 
     if (area/rect.area() > 0.9) 
     { 
      drawContours(result, contours, i, Scalar(255), -1); 
     } 
    } 
} 
+0

是的,正如你指出的那樣,即使對於小的輸入圖像,計算所有距離也會消耗大量時間。我已經檢查過該解決方案。 顏色分割對於灰度圖像不會有用(例子有點令人困惑,不好意思),但我用它來做RGB。 至於Hough變換我做了一些測試,它工作得很好,但經檢測線**不要**交叉相互如下所示:[霍夫(http://i.imgur.com/NP8HT .JPG)。 – sowizz

+0

@sowizz看看更新。 – ArtemStorozhuk

+0

在大多數情況下,這項工作非常好,所以我打算將其標記爲答案。但在某些情況下,由於沒有封閉區域而失敗。形態學操作當時派上用場,但幾乎每種情況下都需要不同的參數,這使得它們不那麼有用。任何想法如何解決這個問題?下面是這種情況的一個例子:[點擊](http://i.imgur.com/mY27w.jpg) – sowizz

9

計算所述一組6米的長度,你將不得不每對之間4個不同的點。如果有多於3個不同的值,那麼在6個長度的集合中,您沒有矩形(2個相等的邊長加上相等的對角長度)

+3

適用了一些公差,當然 –

+0

@RodyOldenhuis當然。 – mathematician1975

+0

好的解決方案,但在這個確切的問題中並不真正有用。計算所有距離即使有100個點也需要很長時間,而我通常會獲得2500個左右。 – sowizz

0

考慮你應該已經得到了數8但你有數量7,那麼你要添加數1 (稱爲增量或糾錯)來糾正它。

以類似的方式有一個delta矩形座標來校正矩形。檢查點(座標)落在delta矩形內。

矩形座標如下所述:

x+delta,y+delta 
x-delta,y+delta 
x+delta,y-delta 
x-delta,y-delta 

讓我知道這是否對你罰款,或者如果你找到一個更好的解決方案

2

您都知道,通過目測檢查點雲你已經可以區分大量的矩形?換句話說,如果你不做某種預選例程,你很可能會找到許多矩形......

無論如何,除了已經由@ mathematician1975給出的方法外,還可以檢查邊(或多或少)是平行的。

讓我們打電話給@ mathematician1975的方法method 1和並行檢查method 2。 Then:

%# method 1: 
n1 = |u1-u2| %# 3 sub., 3 mult, 2 add. per distance 
n2 = |u3-u2| %# total of 6 distances to compute. 
n3 = |u4-u3| %# then max 5+4+3+2+1 = 15 comp. to find unique distances 
n4 = |u1-u4|  
n5 = |u4-u2| %# Total: 
n6 = |u3-u1| %# 12 sub., 18 mult., 12 add, 15 comp 



%# method 2: 
w1 = u1-u2  %# 3 subtractions per vector 
w2 = u3-u2  %# total of 4 vectors to compute 
w3 = u3-u2 
w4 = u1-u4     
         %# 12 sub. 
abs(w1-w3) == [0 0 0] %# 3 sub., 3 comp., 1 sign. 
abs(w2-w4) == [0 0 0] %# 3 sub., 3 comp., 1 sign. 

         %# Total: 18 sub., 6 comp. 2 sign. 

請注意,這些都是最壞的情況;有一些簿記你可以大大降低兩者的成本。請注意0​​需要事先知道頂點已經按照正確的順序。如果情況並非如此,則會增加成本4倍,這更多的是method 1.

請問你如何計算距離?

+0

是的,我知道有這麼多的點會形成很多矩形,但我不確定在這個階段是否有任何事情可以處理(稍後我會計算一些統計數據,以便我可以選擇唯一的矩形)。 兩點之間的距離按照歐幾里德距離計算: '距離= sqrt((x2-x1)^ 2 +(y2-y1)^ 2);'我不確定它是否是2500x4,因爲你必須選擇一個點,然後選擇另一個3,計算距離,然後爲相同的第一個點選擇另一個3點(不同於以前的點),這超出了2500x4的組合。 – sowizz

+1

@sowizz嘗試'norm' - 它應該快很多。或者,如果你願意,可以忽略平方根 - 比較距離平方或距離無關緊要。或者,使用城市街區距離:abs(x2-x1)+ abs(y2-y1)'。這將給出一個非常粗糙但更快的方式*近似於距離,即在矩形的情況下,也必須相等。 –

相關問題