3

Matlabでハフ変換を使用して、いくつかの線を検出しました。これらの線の終点を使用して、それらをプロットしました。すべての変数がある場合、交差する線を見つける方法がわかりません。

Line7
Point1 [50,66]
Point2 [11,106]
theta,rho [45,81]


Line9
Point1 [19,83]
Point2 [53,79]
theta,rho [82,84]

パラメトリック方程式は次のとおりです。

  rho = xCos(theta) + ySin(theta)

これを解決する方法がわかりません。このすべての情報を使用して、線が交差しているかどうかをすばやく見つける方法が必要です。交差している場合は、点も交差しています。

どんなガイダンスでも大歓迎です。

function FindHoughLines(I,filename)
[H,T,R] = hough(I);
rotI = imrotate(I,0,'crop');
imshow(H,[],'XData',T,'YData',R,...
            'InitialMagnification','fit');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
P  = houghpeaks(H,10,'threshold',ceil(0.1*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
 plot(x,y,'s','color','white');
% Find lines and plot them
lines = houghlines(I,T,R,P,'FillGap',5,'MinLength',7);
 figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
    if(isField(lines,'point1') ~= 0)               
   xy = [lines(k).point1; lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

   % Plot beginnings and ends of lines
   plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
   plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
   text(xy(1,1),xy(1,2),[ num2str(k)],'HorizontalAlignment','center','BackgroundColor',[.7 .9 .7]);
   % Determine the endpoints of the longest line segment
   len = norm(lines(k).point1 - lines(k).point2);
   if ( len > max_len)
      max_len = len;
      xy_long = xy;
   end
    end
end

線

4

2 に答える 2

2

頭に浮かぶ最も簡単な方法は、検出されたすべての線をデカルト座標に変換することです

y = -ctg(theta) + r/sin(theta)

次に、 http://en.wikipedia.org/wiki/Bentley–Ottmann_algorithmのような標準的な検出手順を使用します 。

于 2012-04-27T19:13:13.773 に答える
1

または線分の交点が必要ですか? たとえば、線分の 1 つに端点 (1,0) と (2,0) があり、もう 1 つの端点に (0,1) と (0,2) があるとします。(0,0) の交差点をカウントしますか?

たくさんの線があり交点をすべて見つける場合に効率的に対処する必要がありますか、それともすべての線のペアを考慮して 1 つずつチェックしてもよいでしょうか?

最も簡単なケースは、線のペアを考慮するだけでよい場合、および線 (線分ではなく) の交点で十分である場合です。次に、線の各ペアに対して、2 つの連立一次方程式 aX+bY=c、dX+eY=f を解くだけです。これは非常に標準的なことです。これは、2x2 行列を反転することになります。

交点が実際には指定された線分内にない場合に気付く必要がある場合は、いくつかの方法があります。(1) まず最初に上記のように交差し、それが各セグメント内にあることを確認します。これを行うには、1 つの座標 (x 座標など) を選択し、2 つの端点の x 座標の間にあるかどうかを確認します。もちろん、垂直線に x 座標を使用することはできず、ほぼ垂直な線には使用しないでください。係数が大きい方の座標を選択することをお勧めします。(2) (x,y)=(x1,y1)+t(dx1,dx1) および (x,y)=(x2,y2)+u(dx2,dy2) としてパラメトリックに行を記述します。x、y の連立方程式の代わりに、t、u の連立方程式があります。それらを解いて、0 <= t,u <= 1 であることを確認してください。

回線が多いときに効率的に対処する必要がある場合は、そのためのアルゴリズムがあります。「ラインスイープ」をグーグルで検索して、非常に理解しやすい標準的なものを見つけてください。

于 2012-04-27T19:04:43.873 に答える