首页 文章

在2D点 Cloud 中找到最大的空矩形(迷失方向)

提问于
浏览
0

如上所述,我想在给定的2D点 Cloud 中找到最大的空矩形 . 然后,该信息将用于获得图像中显示为绿线的平行线,然后将其用于获得LiDAR旋转的角度 .

我已经在matlab中使用此点 Cloud 数据尝试了凸包,边界和alpha形状函数 . 从它的外观来看,我认为我必须这样做

(1)将点 Cloud 分成两个块(礼品包装算法?)然后

(2)申请边界功能;用坐标提取边界函数,

(3)我正在考虑运行RANSAC线路配件 .

然而,RANSAC需要更多的积分来判断线路的“适应性” . 目前我正在探索霍夫变换,看看线检测是否适用于这种情况 .

这里的问题是,

(1)我在正确的轨道上找到绿线吗?或者,还有更好的方法?

(2)当线垂直时,如何从线获得角度值/梯度(tan(90)= inf)

第二幅图像描绘了原点可能位于 Cloud 点的中心或偏移处 . 可以假设将存在与中心具有不同距离的平行线

Parallel lines to be found without Offset

Parallel lines to be found with Offset

1 回答

  • 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
    

相关问题