2010-08-15 183 views
1

我有点基于相对法线分类点的问题。 我想要做的是使用我得到的信息来拟合一个简化的多边形的点,在一定程度上偏向90度的角度。基于点和法线识别边缘

我对每个点都有粗糙的(虽然不是很准确的)法线,但我不确定如何区分点的接近度和法线的接近度。我打算分块的点,每个面后做线性回归,作为正常线有时不与实际面合身(尽管它们彼此接近的每个面)

实施例: alt text http://a.imageshack.us/img842/8439/ptnormals.png

理想情况下,我希望能够围绕此数据绘制一个矩形。但是,多边形不需要凸出,也不必与轴对齐。

任何提示如何实现这样的东西将是非常棒的。

在此先感谢

+0

我没有这样的事情都解决了“官路”的想法,但不会“测量”连续3点之间的角度,寻找最接近90度的人。,给你的边缘点(中间的一个)? – Rook 2010-08-15 22:16:30

+0

一个有趣的例子,顺便说一句。我喜欢。 – Rook 2010-08-15 22:17:35

+0

虽然有时会出现一些噪音,但您可能有一点与另外两点之间呈90度夹角,但通常会放在一条直线上:\ – Xzhsh 2010-08-15 22:18:57

回答

1

我想尝试以下

  1. 集群基础上的接近和类似角点。我会使用单连接层次聚类(Matlab中的LINKAGE),因为您不知道先验会有多少条边。单联动有利于线性结构,这正是您要找的。作为两点之间的距离标准,您可以使用点坐标之间的欧式距离乘以角度函数,一旦角度差异超过20或30度,角度函数就会非常陡峭地增加。
  2. 对数据进行(强健)线性回归。使用法线可能会帮助或不会帮助。我的猜测是他们不会帮助太多。为了简单起见,您可能最初想要忽略法线。
  3. 查找线条之间的交点。
  4. 如果必须,您可以随时尝试和改善配合,例如通过限制相对的线条平行。

如果不成功,您可以尝试并实施THIS PAPER中的方法,该方法允许一次拟合多条直线。

+0

谢谢,这看起来像我在找什么。我在星期日没有时间在实验室工作,但我明天会尝试并回复你。再次感谢! – Xzhsh 2010-08-16 00:42:56

0

你可以得到每一边的X和Y坐标的平均值,然后根据这个值得到线。

2

我不知道如果这是你在找什么,但这里是我的,我的理解是解决问题的尝试:

我现在用的是正常的向量的角度,找到属于每个侧分的矩形(左,右,上,下),然后简单地适合每一条线。

%# create random data (replace those with your actual data) 
num = randi([10 20]); 
pT = zeros(num,2); 
pT(:,1) = rand(num,1); 
pT(:,2) = ones(num,1) + 0.01*randn(num,1); 
aT = 90 + 10*randn(num,1); 

num = randi([10 20]); 
pB = zeros(num,2); 
pB(:,1) = rand(num,1); 
pB(:,2) = zeros(num,1) + 0.01*randn(num,1); 
aB = 270 + 10*randn(num,1); 

num = randi([10 20]); 
pR = zeros(num,2); 
pR(:,1) = ones(num,1) + 0.01*randn(num,1); 
pR(:,2) = rand(num,1); 
aR = 0 + 10*randn(num,1); 

num = randi([10 20]); 
pL = zeros(num,2); 
pL(:,1) = zeros(num,1) + 0.01*randn(num,1); 
pL(:,2) = rand(num,1); 
aL = 180 + 10*randn(num,1); 

pts = [pT;pR;pB;pL];     %# x/y coords 
angle = mod([aT;aR;aB;aL],360);  %# angle in degrees [0,360] 

%# plot points and normals 
plot(pts(:,1), pts(:,2), 'o'), hold on 
theta = angle * pi/180; 
quiver(pts(:,1), pts(:,2), cos(theta), sin(theta), 0.4, 'Color','g') 
hold off 

%# divide points based on angle 
[~,bin] = histc(angle,[0 45 135 225 315 360]); 
bin(bin==5) = 1;      %# combine last and first bin 

%# fit line to each segment 
hold on 
for i=1:4 
    %# indices of points in this segment 
    idx = (bin == i); 

    %# x/y or y/x 
    if i==2||i==4, xx=1; yy=2; else xx=2; yy=1; end 

    %# fit line 
    coeff = polyfit(pts(idx,xx), pts(idx,yy), 1); 
    fit(:,1) = 0:0.05:1; 
    fit(:,2) = polyval(coeff, fit(:,1)); 

    %# plot fitted line 
    plot(fit(:,xx), fit(:,yy), 'Color','r', 'LineWidth',2) 
end 
hold off 

plot

+0

感谢Amro的回答。我不确定我是否描述得很好,但我的数据并不仅限于矩形,它们的表现也不是很好。 – Xzhsh 2010-08-16 17:34:50

+0

@Xzhsh:上面的解决方案并不是真正适合一个矩形,更像是4个线段,每个线段都由具有法线方向的点确定。也许您应该准确描述您期望的结果;根据你发布的数据,这些点几乎形成一个矩形。 – Amro 2010-08-17 08:33:39

+0

根据我张贴的数字,我确实想要得到一个矩形,但我可能不清楚我的数据的性质。由于它是屋顶的激光雷达数据,因此我可以获得三角形,八角形或任何类型的多边形。我无法将这组结果限制为四边形的结果:\。也就是说,你的答案中的一些线条确实对我有帮助(当我有一条线时,我被困在一条垂直线上),所以非常感谢你的帮助! – Xzhsh 2010-08-17 17:35:17