Как найти точку пересечения между линиями Matlab

У меня есть 2 или 3 линии, проведенные по краям дороги, эти линии пересекаются в точке горизонта, где встречаются дорога и небо. Я хочу найти и построить эту точку. Как я могу добиться этого, используя линии hough? У меня в голове крутится идея карты голосования, как я могу создать карту голосования? Это мой код. Предположим, что линии пересечения краев дороги пересекаются и составляют треугольник с участком дороги внутри. вот мое выходное изображение

введите здесь описание изображения

 I  =  imread('1.jpg');


 J = imfilter(I, fspecial('gaussian', [17 17], 5), 'symmetric');

se3 = strel('disk', 4);

%J = imdilate(J, se);

J = rgb2gray(J);

BW = edge(J, 'sobel');
BW = imdilate(BW, se3);

[H T R] = hough(BW);

P  = houghpeaks(H, 4);

lines = houghlines(J, T, R,P);
 Q = figure(5);
 imshow(I) 
 hold on;

 xy1 = [lines(3).point1; lines(3).point2];
 line1 =  plot(xy1(:,1),xy1(:,2),'LineWidth',6,'Color','blue');

  xy2 = [lines(4).point1; lines(4).point2];
 line2 =  plot(xy2(:,1),xy2(:,2),'LineWidth',6,'Color','blue');

  xy3 = [lines(2).point1; lines(2).point2];
 line3 =  plot(xy3(:,1),xy3(:,2),'LineWidth',6,'Color','blue');

person Hasham Tahir    schedule 11.06.2011    source источник


Ответы (3)


если у вас есть уравнения линий, вам просто нужно решить 3 уравнения с двумя неизвестными (x, y точки пересечения). Используйте для этого оператор матричного деления Matlab (\). Например: у вас есть 3 строки:

  • X + 2Y = 7,
  • 3X + 4Y = 8,
  • 5X + 6Y = 9

Код:

A = [1,2;3,4;5,6]
b = [7,8,9]'
x = A\b

Если вы не знаете уравнений, а знаете только пиксели, в которых проходят эти линии, нарисуйте все линии на черном изображении и найдите максимальное значение пикселя. Точка пересечения будет в 3 раза ярче остальных линий. Если вы хотите сократить время выполнения, начните с пикселя на произвольной линии и перебирайте его соседей, пока не найдете точку пересечения.

person DanielHsH    schedule 12.06.2011
comment
Спасибо DanielHsH. Если вы можете дать мне только пример кода для начала? Спасибо - person Hasham Tahir; 13.06.2011

Отсутствие уравнений или точек на линии усложняет задачу. Если это одноразовая операция и у вас всего 3 строки, я бы предложил использовать ginput и выбирая точки вручную.

Итак, после того, как вы нарисовали свою фигуру, введите [x,y]=ginput; в командной строке. Это должно привлечь внимание к вашей фигуре, и вы увидите перекрестие, которое вы можете перемещать по фигуре. Теперь нажмите на три точки, которые вас интересуют, а затем нажмите Enter. Теперь x и y будут содержать координаты трех точек.

person abcd    schedule 11.06.2011
comment
Я ценю вашу помощь, но это не то, что я ищу. Этот код будет реализован в видео и в реальном времени. im, используя линии hough, позволяет предположить, что линии hough еще не являются частью изображения, но эти линии пересекаются. я хочу, чтобы эта точка была точкой схода или горизонтом дороги. я имею смысл? Извините за мой английский :( - person Hasham Tahir; 11.06.2011
comment
@Hasham: Это та информация, которую вы должны предоставить в своем вопросе, чтобы другие поняли, что вы пытаетесь сделать ... пожалуйста, отредактируйте свой вопрос, чтобы добавить больше деталей. - person abcd; 11.06.2011

Общая стратегия такова: 1. Выберите две точки на каждой линии пересечения 2. Используйте эти две точки, чтобы получить уравнение линии 3. Используйте уравнения линий, чтобы найти точку их пересечения

Вы должны выяснить, как выбрать две точки на каждой линии, скажем, для линии 1 это p1 и p2, а для линии 2 это q1 и q2. Тогда, если p[1|2], q[1|2] — двумерные векторы-строки, то

line1 = GetLineFromTwoImagePoints(p1, p2);
line2 = GetLineFromTwoImagePoints(q1, q2);
intersection = GetPointFromTwoImageLines(line1, line2);

function line = GetLineFromTwoImagePoints( one, two )
    line = cross([one 1], [two 1]);
end

function point = GetPointFromTwoImageLines( one, two )
    p = cross(one, two);
    point = [p(1)/p(3) p(2)/p(3)];
end
person Sanfer    schedule 07.03.2017