基于点和法线识别边缘
我有点基于相对法线分类点的问题。 我想要做的是使用我得到的信息来拟合一个简化的多边形的点,在一定程度上偏向90度的角度。基于点和法线识别边缘
我对每个点都有粗糙的(虽然不是很准确的)法线,但我不确定如何区分点的接近度和法线的接近度。我打算分块的点,每个面后做线性回归,作为正常线有时不与实际面合身(尽管它们彼此接近的每个面)
实施例: alt text http://a.imageshack.us/img842/8439/ptnormals.png
理想情况下,我希望能够围绕此数据绘制一个矩形。但是,多边形不需要凸出,也不必与轴对齐。
任何提示如何实现这样的东西将是非常棒的。
在此先感谢
我想尝试以下
- 集群基础上的接近和类似角点。我会使用单连接层次聚类(Matlab中的LINKAGE),因为您不知道先验会有多少条边。单联动有利于线性结构,这正是您要找的。作为两点之间的距离标准,您可以使用点坐标之间的欧式距离乘以角度函数,一旦角度差异超过20或30度,角度函数就会非常陡峭地增加。
- 对数据进行(强健)线性回归。使用法线可能会帮助或不会帮助。我的猜测是他们不会帮助太多。为了简单起见,您可能最初想要忽略法线。
- 查找线条之间的交点。
- 如果必须,您可以随时尝试和改善配合,例如通过限制相对的线条平行。
如果不成功,您可以尝试并实施THIS PAPER中的方法,该方法允许一次拟合多条直线。
谢谢,这看起来像我在找什么。我在星期日没有时间在实验室工作,但我明天会尝试并回复你。再次感谢! – Xzhsh 2010-08-16 00:42:56
你可以得到每一边的X和Y坐标的平均值,然后根据这个值得到线。
我不知道如果这是你在找什么,但这里是我的,我的理解是解决问题的尝试:
我现在用的是正常的向量的角度,找到属于每个侧分的矩形(左,右,上,下),然后简单地适合每一条线。
%# 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
感谢Amro的回答。我不确定我是否描述得很好,但我的数据并不仅限于矩形,它们的表现也不是很好。 – Xzhsh 2010-08-16 17:34:50
@Xzhsh:上面的解决方案并不是真正适合一个矩形,更像是4个线段,每个线段都由具有法线方向的点确定。也许您应该准确描述您期望的结果;根据你发布的数据,这些点几乎形成一个矩形。 – Amro 2010-08-17 08:33:39
根据我张贴的数字,我确实想要得到一个矩形,但我可能不清楚我的数据的性质。由于它是屋顶的激光雷达数据,因此我可以获得三角形,八角形或任何类型的多边形。我无法将这组结果限制为四边形的结果:\。也就是说,你的答案中的一些线条确实对我有帮助(当我有一条线时,我被困在一条垂直线上),所以非常感谢你的帮助! – Xzhsh 2010-08-17 17:35:17
我没有这样的事情都解决了“官路”的想法,但不会“测量”连续3点之间的角度,寻找最接近90度的人。,给你的边缘点(中间的一个)? – Rook 2010-08-15 22:16:30
一个有趣的例子,顺便说一句。我喜欢。 – Rook 2010-08-15 22:17:35
虽然有时会出现一些噪音,但您可能有一点与另外两点之间呈90度夹角,但通常会放在一条直线上:\ – Xzhsh 2010-08-15 22:18:57