如何使用pcl的聚类方法对6d数据进行聚类,比如Eigen::Matrix<double,6,1>

how can I use pcl's clustering method to cluster 6d data, such as Eigen::Matrix<double,6,1>

我想通过 PCL 对 6d 数据进行聚类;

typedef Eigen::Matrix<double,6,1> Vector6d;
pcl::search::KdTree<Vector6d>::Ptr tree (new pcl::search::KdTree<Vector6d>);
tree->setInputCloud (pose_cloud);
pcl::EuclideanClusterExtraction<Vector6d> ec;
ec.setClusterTolerance (0.2); 
ec.setMinClusterSize (1);
ec.setMaxClusterSize (25000)
ec.setSearchMethod (tree);
ec.setInputCloud (pose_cloud);
std::vector<pcl::PointIndices> cluster_indices;
ec.extract (cluster_indices);

关于未定义的引用会有很多错误。

pcl::PointXYZRGB好像是一个6d的数据,我可以用pcl::PointXYZRGB来存储我的数据吗?但是聚类似乎只发生在XYZ的前三个数据中。

Eucleadien 聚类距离基于 radius search queries, which is based on the point-representation。所以模板化的 PointRepresentation class 负责生成执行聚类的向量。在pcl::PointXYZRGB的情况下,只有x-y-z坐标被矢量化。

选项 1

您可以覆盖默认值 PointRepresentation,如 pair-wise registration tutorial 中所示。

示例 - 基于教程,但适用于 pcl::PointXYZINormal(因为您对 6 个浮点数感兴趣,所以 pcl::PointXYZRGB 不适合)。另请注意,与教程不同,PointRepresentation class 应设置为树对象。

class MyPointRepresentation : public pcl::PointRepresentation <pcl::PointXYZINormal>
{
  using pcl::PointRepresentation<pcl::PointXYZINormal>::nr_dimensions_;
public:
  MyPointRepresentation ()
  {
    // Define the number of dimensions
    nr_dimensions_ = 6;
  }

  // Override the copyToFloatArray method to define our feature vector
  virtual void copyToFloatArray (const pcl::PointXYZINormal &p, float * out) const
  {
    out[0] = p.x;
    out[1] = p.y;
    out[2] = p.z;
    out[0] = p.normal_x;
    out[1] = p.normal_y;
    out[2] = p.normal_z;
  }
};

// Instantiate our custom point representation (defined above) and weight the dimensions
MyPointRepresentation point_representation;
float alpha[6] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
point_representation.setRescaleValues (alpha);

pcl::search::KdTree<pcl::PointXYZINormal>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZINormal>);
tree->setPointRepresentation (boost::make_shared<const MyPointRepresentation> (point_representation));

选项 2

我认为您可以使用 pcl::Histogram<N> 点类型。我找不到它的定义位置,但我相信可以安全地假设它的点表示就是它的 N 值。