【问题标题】:Best fit for the intersection of multiple lines最适合多条线的交叉点
【发布时间】:2011-09-15 12:04:55
【问题描述】:

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

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

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

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

详情:

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

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

  • 左下角的图像显示了我们想要的 - 线的交点,如预期的那样(两条紫色线都被消除了)。

  • 右下图显示了另一条紫色线(另一条被移除)如何影响结果。

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

谢谢,

尤利安

【问题讨论】:

    标签: algorithm opencv geometry computational-geometry


    【解决方案1】:

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

    我会尝试一个迭代解决方案:如果第一个解决方案的误差太大,从一组分段中删除最远的解决方案,并迭代直到误差小到可以接受。这应该删除许多交点之一,并收敛到附近有最多线的那个。

    【讨论】:

    • +1 有趣的方法。我会检查算法的复杂性,然后再试一试。
    • 您可以使用“80/20规则”跳过几个步骤,即找到所有线的最佳交点,按与交点的距离对线进行排序,消除最差的20%并再次求解使用剩余的 80%。
    【解决方案2】:

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

    【讨论】:

    • 你是对的,但是你可以看到来自左下角的线确定了一个独特的交点,它适合我想要的绿线的交点......所以可能有一个消除错误紫色线条的解决方案
    【解决方案3】:

    您可以使用 SVD incase 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 2016-09-11
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多