1

是否有任何算法或最好是代码片段来组织和分组由 Kinect 从点云图像生成的几乎放置的点(在半径或特定数量的邻居内组织)并将其转换为一个点。我想增加尺寸,从而减少点数。

4

3 回答 3

4

这是一个广泛的主题,称为“聚类分析”。在这里查看更多信息。您应该使用几种聚类方法进行一些实验。

于 2013-02-02T11:11:31.267 回答
0

一种简单的方法如下:

  1. 修复要用于集群的“epsilon”值
  2. 对于每个点,从坐标计算一个“簇键”
  3. 将所有点添加到由集群键索引的地图
  4. 通过仅检查集群和附近的集群来收集所有组

在代码中:

std::map<CellIndex, std::vector<P3d> > pmap;

for (int  i=0,n=pts.size(); i<n; i++)
{
    int ix = int(pts[i].x / eps);
    int iy = int(pts[i].y / eps);
    int iz = int(pts[i].z / eps);
    pmap[CellIndex(ix, iy, iz)].push_back(pts[i]);
}

for (std::map<CellIndex, std::vector<P3d> >::iterator i=pmap.begin(),e=pmap.end();
     i != e;
     ++i)
{
    // get cluster center
    int cx = i->first.ix;
    int cy = i->first.iy;
    int cz = i->first.iz;

    // collect points from all 9 cluster with x index between cx-1 and cx+1
    // between cy-1 and cy+1 and between cz-1 and cz+1 (inclusive).
    // Not all clusters are guaranteed to be present in the map.
    // You will be considering only points that are at most 1.5*sqrt(3)*eps from
    // the center of the (cx, cy, cz) cell.
}

根据您需要做的计算,有时可以通过将中间结果保存在单元格本身而不是将点存储在其中来执行一次传递。

于 2013-02-02T12:07:03.520 回答
0

您是否考虑过使用mean Shift

于 2013-02-02T19:11:02.150 回答