如何使用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
值。
我想通过 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
值。