2016-11-18 215 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。非常感谢你。现在我明白并知道如何去做。感谢您的杰出答案! –