2016-11-18 214 views
0

Test image如何通過opencv判斷輪廓是線還是曲線?

夥計們。該圖像有兩個輪廓。我可以用opencv findcontour函數找到它們。我想知道的是如何判斷哪條輪廓線和哪條輪廓線是曲線?任何人都可以告訴如何去做?任何建議將被認真考慮。先謝謝了。

+0

在輪廓的第一個點和最後一個點之間定義一條直線,並測量所有其他點與直線的平均距離。如果輪廓是線條,則平均距離接近於0. –

+0

Hi Nico。感謝您的回答。這看起來非常複雜。我想知道是否有更簡單的方法來做到這一點?對不起,我英文很差。 –

+0

你可以做的是用輪廓的第一個和最後一個點進行擬合,並檢查其他點是否落在上面。你不需要檢查所有的點來確定這一點,你可以簡單地選擇每個'第n'點。 –

回答

0

首先假定你有一條線,並應用一些基本的代數。

首先找到線的斜率和y截距。線的斜率被定義爲y的變化除以x的變化。所以給出了兩個點(X0,Y0),(X1,Y1):

y = mx + b 
b = y - mx 

所以

slope = (y0-y1)/(x0-x1) 

的y截距是使用斜率截距方程(y=mx+b)並求解對於b發現

y_intercept = y0 - slope * x0 

一旦你有斜率和Y軸截距,你只需要遍歷輪廓的點,看看所有的點是否落在同一條線上。如果他們這樣做,你有一條線;如果他們不這樣做,你會有一條曲線。

因爲我不知道你正在使用什麼語言,這裏是僞代碼的整個過程:

// First assume you have a line - find the slope and y-intercept 
slope = (point[0].y - point[1].y)/(point[0].x - point[1].x); 
y_intercept = point[0].y - (slope * point[0].x); 

// Using slope-intercept (y = mx + b), see if the other points are on the same line 
for (n = 0 to numPoints) 
{ 
    if ((slope * point[n].x + y_intercept) != point[n].y) 
    { 
     // You've found a point that's not on the line - as soon as you 
     // find a point that's not on the line, you know that the contour 
     // is not a straight line 
    } 
} 

請注意,您使用浮點數這裏要處理,所以你」在if條件中必須考慮到這一點 - 您無法直接比較浮點數的相等性,因此您需要將它們舍入到某個可接受的準確度。爲了保持僞代碼的簡單性,我放棄了這一點。

+0

幾點:使用前兩個點來定義線條可能會產生很大的噪音,因爲它們非常接近。使用第一個和最後一個點應該會更好。使用一維斜率和截距不適用於垂直線。因此,最好用2D矢量(起始點和方向)定義線,然後計算點與線的實際距離。 –

+0

嗨,Jeff&Nico。非常感謝你。現在我明白並知道如何去做。感謝您的傑出答案! –