0

Test image輪郭を判断する方法は、opencvによって線または曲線ですか?

男。この画像には2つの輪郭があります。私はopencv findcontour関数で両方を見つけることができます。私が知りたいのは、どんな輪郭が線であり、どの輪郭が曲線であるかを判断する方法です。誰でもそれをする方法を教えてもらえますか?アドバイスをいただければ幸いです。ありがとうございました。

+0

輪郭の最初の点と最後の点の間に線を定義し、他のすべての点の線までの平均距離を測定します。輪郭が線である場合、平均距離は0に近い。 –

+0

ハイニコ。ご回答有難うございます。これは非常に複雑に思えます。私はこれをするより簡単な方法があるかどうか疑問に思っていますか?私の貧しい英語を申し訳ありません。 –

+0

あなたができることは、輪郭の最初と最後の点を使用して線をはめ込み、他の点がその上にあるかどうかをチェックすることです。あなたはこれを確認するためにすべての点をチェックする必要はありません、あなたは単にすべてのn番目の点を選ぶことができます。 –

答えて

0

まず、線があると仮定し、いくつかの基本代数を適用します。

まず、直線とy切片の傾きを求めます。線の傾きは、yの変化をxの変化で割ったものとして定義されます。

y = mx + b 
b = y - mx 

ので

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

y切片が傾き、切片式(y=mx+b)を使用し、Bについて解く見出される。ので、2つの点(X0、Y0)、(X1、Y1)が与えられました

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 
    } 
} 

あなたはここに浮動小数点数を扱うことになります。注ので、あなた」浮動小数点数を直接比較することはできませんので、許容範囲内で丸めなければなりません。私は擬似コードを単純に保つためにそれを残しました。

+0

いくつかの点:線を定義するために最初の2つの点を使用すると、非常に近いためにおそらく多くのノイズになります。最初と最後のポイントを使用する方が効果的です。 1Dスロープとインターセプトを使用すると、垂直線では機能しません。したがって、2Dベクトル(開始点と方向)で線を定義し、線に対する点の実際の距離を計算する方が良いです。 –

+0

こんにちはJeff&Nico。どうもありがとうございました。今私は理解し、それを行う方法を知っています。あなたの素晴らしい答えをありがとう! –

関連する問題