Обнаружение пересекающихся линий после преобразования Хафа

Используя преобразование Хафа в 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

Линии


person Community    schedule 27.04.2012    source источник
comment
Взгляните на этот пост, возможно, это поможет. stackoverflow.com/ questions / 2050850 /   -  person Rob Taylor    schedule 27.04.2012
comment
@RobTaylor, спасибо, это был ответ!   -  person    schedule 28.04.2012


Ответы (2)


Самый простой способ, который приходит на ум, - это преобразовать все обнаруженные линии в декартовы координаты, используя

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

Затем используйте стандартную процедуру обнаружения, например http://en.wikipedia.org/wiki/Bentley%E2%80%93Ottmann_algorithm

person Viktor Latypov    schedule 27.04.2012

Вы хотите пересечения линий или отрезков линий? Например, предположим, что один из ваших линейных сегментов имеет конечные точки (1,0) и (2,0), а другой - конечные точки (0,1) и (0,2); Вы хотите, чтобы пересечение в точке (0,0) было засчитано или нет?

Нужно ли вам эффективно справляться со случаем, когда линий очень много и найти все их пересечения, или можно рассматривать все пары линий и проверять их одну за другой?

Самый простой случай - это нормально рассматривать только пары линий, и если пересечения линий (в отличие от отрезков) достаточно хороши. Затем для каждой пары линий вы просто решаете два одновременных линейных уравнения: aX + bY = c, dX + eY = f. Это очень стандартная вещь; это равносильно инвертированию матрицы 2x2.

Если вам нужно заметить, когда пересечение фактически не находится в пределах данных сегментов линии, вот несколько подходов. (1) Сначала сначала сделайте пересечение, как указано выше, затем убедитесь, что оно находится внутри каждого данного сегмента. Вы можете сделать это, выбрав одну координату (скажем, координату x) и проверив, находится ли она между координатами 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.

Если вам нужно эффективно справляться, когда у вас много линий, для этого есть алгоритмы; погуглите "строчка", чтобы найти стандартный, который довольно легко понять.

person Gareth McCaughan    schedule 27.04.2012
comment
Спасибо за ответ. На самом деле у меня много линий, и я хочу найти пересечение линий вместо отрезков. Линии, которые действительно пересекаются. - person ; 28.04.2012