2013-04-03 55 views
7

私にはイメージがあり、その中にいくつかの形があります。私はハフラインを使って線を検出しました。どのラインを並行して検出することができますか?デカルト座標におけるラインのPython openCVは平行線を検出します

+0

を変換しないために:]ここを参照してください(のhttp:/ /scikit-image.org/docs/dev/auto_examples/plot_line_hough_transform.html)。おそらく、シータが従属軸になるように、独立軸(thetaまたは 'X')と従属軸(rhoまたは 'Y')を反転させることができます。このHough空間画像を閾値処理した後(最も可能性の高い線に対応する(ρ、θ)の最も強いスポットを得るために)、データに水平線を当てはめることができる:theta = constant(y = mx + b )。 – chase

答えて

13

式:

Y = K * X + B

二線Y = K1 * X + B1、Y = K2 * X + B2である平行、K1なら= k2。

したがって、検出された行ごとに係数kを計算する必要があります。 するためには

一意は、あなたがラインに属し二点の座標を知っておく必要がありますラインの方程式を識別する。 HoughLines(С++)と行を発見した後

vector<Vec2f> lines; 
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0); 

あなたは極座標で検出された線のパラメータ(R、シータ)を格納するベクトル線を有します。あなたは、デカルト座標でそれらを転送する必要があります:C++でここ

例:

for(size_t i = 0; i < lines.size(); i++) 
{ 
    float rho = lines[i][0], theta = lines[i][1]; 
    Point pt1, pt2; 
    double a = cos(theta), b = sin(theta); 
    double x0 = a*rho, y0 = b*rho; 
    pt1.x = cvRound(x0 + 1000*(-b)); //the first point 
    pt1.y = cvRound(y0 + 1000*(a)); //the first point 
    pt2.x = cvRound(x0 - 1000*(-b)); //the second point 
    pt2.y = cvRound(y0 - 1000*(a)); //the second point 
} 

あなたはその方程式を計算することができますラインのこれら2つの点を得た後。

+0

あなたの解決のために多くのthx。 – vtokmak

+3

検出ラインのパラレルチェックの値は十分ですか?シータ値が平行線よりも等しいと言うことができますか? – vtokmak

+0

私はtheta値をチェックするのが十分なチェックであるべきだと思います。 –

1

HoughLinesは、結果を極座標で返します。それで、角度の2番目の値を確認してください。タグに記載されているように、これは、Pythonで行われている場合は不要あなたがhoughspace出力画像を提供houghlinesのscipyのダウンロード版を、使用することができ、Y、Xに

def findparallel(lines): 

lines1 = [] 
for i in range(len(lines)): 
    for j in range(len(lines)): 
     if (i == j):continue 
     if (abs(lines[i][1] - lines[j][1]) == 0):   
      #You've found a parallel line! 
      lines1.append((i,j)) 


return lines1 
関連する問題