我试图解决以下问题:
我正在使用这个opencv的函数cvSolve。对于相当好的输入,一切都很好。
我所遇到的问题来自这样一个事实:当我只有一个糟糕的部分作为输入时,结果与预期的结果不同。

详细信息:
如您所见,只有两行,结果与预期的完全不同。任何关于如何避免这种情况的想法都是值得赞赏的。
谢谢,
尤莲
发布于 2011-06-15 12:29:16
正如链接中所描述的,您使用的算法找到了该问题的最小二乘错误解决方案。这意味着,如果有更多的交点,结果将是一个平均值(对平均值的合理定义)的实际解。
我会尝试一个迭代解决方案:如果第一个解的错误太大,从段的集合中移除最远到解的一个,然后迭代,直到错误可接受地小。这将移除多个交点中的一个,并将其收敛到附近大多数直线的交点上。
发布于 2011-06-15 14:35:12
对这类问题的一个一般答案是RANSAC算法 (处理这个问题),但是它有一些缺点,例如,您需要预先估计诸如“预期异常值的数量”之类的东西。我在你的例子中看到的另一个问题是,去掉这两条绿线也会产生一个非常合适的结果,所以这可能是一个更普遍的问题。
发布于 2016-04-06 08:57:36
可以在line1 =(x1,y1)-(x2,y2);line2 =(x2,y2)-(x3,y3)的情况下使用SVD求解。
设Ax =b;
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*yhttps://stackoverflow.com/questions/6357625
复制相似问题