在Matlab中使用Hough变换,检测到一些行。使用这些线的终点我绘制了它们。当我拥有所有变量时,我无法理解如何找到相交线。
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
答案 0 :(得分:2)
最让人想到的方法是使用
将所有检测到的线转换为笛卡尔坐标y = -ctg(theta) + r/sin(theta)
然后使用标准检测程序,如http://en.wikipedia.org/wiki/Bentley–Ottmann_algorithm
答案 1 :(得分:1)
您想要行或线段的交叉点吗?例如,假设您的一个线段具有端点(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。
如果你需要在有很多行时有效地应对,那么就有算法; google“line sweep”找到一个非常容易理解的标准版。