最适合多条线的交叉点

时间:2011-06-15 12:23:00

标签: algorithm opencv geometry computational-geometry

我正在尝试解决以下问题:

  • 我正在分析图像,我从此分析中获得了一组段
  • 我想知道这些线的交叉点(最合适)

我正在使用这个opencv的函数cvSolve。对于相当好的输入,一切正常。

我遇到的问题是,当我只有一个坏段作为输入时,结果与预期的不同。

Bad lines influencing result

详细信息:

  • 左上图显示影响结果的“孤独”紫色线条(所有线条都用作输入)。

  • 右上角的图片显示了一条紫色线(一条被移除)如何影响结果。

  • 左下方的图像显示我们想要的内容 - 预期的线条交叉(消除了紫色线条)。

  • 右下图显示其他紫色线(另一条紫色线)如何影响结果。

正如您只能看到两行,结果与预期结果完全不同。关于如何避免这种情况的任何想法都值得赞赏。

谢谢,

尤利安

3 个答案:

答案 0 :(得分:6)

您正在使用的算法找到问题的最小平方错误解决方案,如链接中所述。这意味着如果有更多的交叉点,结果将是真实解决方案的平均值(对于平均值的合理定义)。

我会尝试一个迭代解决方案:如果第一个解决方案的错误太大,请从解决方案中最远的一组段中删除,然后迭代直到错误可接受地小。这应该删除多个交叉点中的一个,并收敛于附近大多数线的那个。

答案 1 :(得分:1)

这类问题的一般答案是RANSAC algorithmquestion dealing with this),但是它有一些缺点,例如你需要事先估计诸如“预期的异常值数”之类的事情。我在您的示例中看到的另一个问题是删除两条绿线也会导致非常合适,因此这可能是一个更普遍的问题。

答案 2 :(得分:0)

你可以使用SVD求解line1 =(x1,y1) - (x2,y2); line2 =(x2,y2) - (x3,y3)

让Ax = b where;

A = [-(y2-y1) (x2-x1);
     -(y3-y2) (x3-x2);
    .................
    .................] -->(nx2)
x = transpose[s t]     -->(2x1)
b = [-(y2-y1)x1 + (x2-x1)y1 ;
     -(y3-y2)x2 + (x3-x2)y2 ;
    ........................
    ........................] --> (nx1)

Example; Matlab Code

line1=[0,10;5,10]
line2=[10,0;10,5]
line3=[0,0;5,5]

A=[-(line1(2,2)-line1(1,2)),(line1(2,1)-line1(1,1));
-(line2(2,2)-line2(1,2)),(line2(2,1)-line2(1,1));
-(line3(2,2)-line3(1,2)),(line3(2,1)-line3(1,1))];


b=[(line1(1,1)*A(1,1))+ (line1(1,2)*A(1,2));
   (line2(1,1)*A(2,1))+ (line2(1,2)*A(2,2));
   (line3(1,1)*A(3,1))+ (line3(1,2)*A(3,2))];

[U D V] = svd(A)
bprime = U'*b

y=[bprime(1)/D(1,1);bprime(2)/D(2,2)]

x=V*y