在C ++中对Kinect生成的点进行分组

时间:2013-02-02 09:44:28

标签: c++ image-processing kinect cluster-analysis

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

3 个答案:

答案 0 :(得分:4)

这是一个称为“聚类分析”的广泛主题。查看here了解更多信息。你应该用几种聚类方法做一些实验。

答案 1 :(得分:0)

一个简单的方法如下:

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

    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.
    }
    

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

答案 2 :(得分:0)

您是否考虑过使用 mean Shift