如上所述,我想在给定的2D点云中找到最大的空矩形。然后,该信息将用于获得图像中显示为绿线的平行线,然后将其用于获得LiDAR旋转的角度。
我已经在matlab中使用此点云数据尝试了凸包,边界和alpha形状函数。从它的外观来看,我认为我必须
(1)将点云分成两个块(礼品包装算法?)然后
(2)应用边界函数;使用边界函数的坐标提取,
(3)我正在考虑运行RANSAC线路配件。
然而,RANSAC需要更多的积分来判断线路的“适应性”。目前我正在探索霍夫变换,看看线检测是否适用于这种情况。
因此这里的问题是,
(1)我在正确的轨道上找到绿线吗?或者有更好的方法吗?
(2)当线垂直时,如何从线获得角度值/渐变(tan(90)= inf)
第二幅图像描绘的原点可能位于云点的中心或偏移处。可以假设将存在与中心距离变化的平行线
答案 0 :(得分:1)
您可以使用kmeans聚类来查找两个聚类,然后从聚类中找到两个点,它们之间的距离最小
%a function for rotation of points
function out = rot(theta,data)
mat = [cos(theta), -sin(theta);
sin(theta), cos(theta)];
out = data * mat.';
end
a= [rand(505,1)*.4 , rand(505,1) ];
b= [rand(500,1)*.4 + .6 , rand(500,1)];
a = [a;b];
rt = rot(.4,a);
%kmeans clustering
km=kmeans(rt,2);
class1 = rt(km==1,:);
class2=rt(km==2,:);
%find min distance
[srch, d] = dsearchn(class1, class2);
[mn, I] = min(d);
plot(rt(:,1), rt(:,2),'.')
hold on
p1 = class1(srch(I),:);
p2 = class2(I,:);
plot(p1(1),p1(2),'*r')
plot(p2(1),p2(2),'*g')
xy = [class1(srch(I),:);class2(I,:)]
plot(xy(:,1),xy(:,2),'-g')
axis equal