如何使用 pcl 库在区域增长后获得特定的集群?
How to get a specific cluster after region growing using pcl library?
我正在尝试使用基于表面法线的区域增长来分割输入点云,遵循此处的教程:http://pointclouds.org/documentation/tutorials/region_growing_segmentation.php。
我已经能够为我的用例取得令人满意的结果,我还可以使用 pcl::PointCloud ::Ptr colored_cloud = reg.getColoredCloud ();
可视化这些段
但是,我无法找到一种方法来提取包含所有点的法线都指向特定方向的特定聚类,例如,所有点都具有沿 z 轴的点法线的聚类.我假设这样的集群访问应该是可能的,如果我错了请纠正我。此外,获取单个集群的 feature/s 的任何替代方法都会非常有帮助。提前致谢。
看看这些行(来自您提到的教程):
std::vector <pcl::PointIndices> clusters;
reg.extract (clusters);
每个 "cluster" 由 pcl::PointIndices
表示,它只是输入云中 vector<int>
个索引的包装器。
这是一个计算每个簇的平均法线的简单示例:
std::vector<Eigen::Vector3f> mean_normals(clusters.size(), Eigen::Vector3f({ 0.,0.,0. }));
for (auto cluster_idx = 0; cluster_idx < clusters.size(); cluster_idx++)
{
for (auto point_idx: clusters[cluster_idx].indices)
{
mean_normals[cluster_idx] += normals->points[point_idx].getNormalVector3fMap();
}
mean_normals[cluster_idx].normalize();
}
您也可以使用 pcl::PointIndices
使用 pcl::ExtractIndices
、as in this tutorial 为每个集群创建新的云。简短示例:
pcl::PointCloud<pcl::PointXYZ>::Ptr cluster_cloud(new pcl::PointCloud<pcl::PointXYZ>)
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud (cloud);
extract.setIndices (clusters[cluster_idx]);
extract.filter (*cluster_cloud);
您必须将 pcl::PointIndices
的簇转换为 pcl::PointIndicesConstPtr
以将其输入 extract.setIndices()
。这是一个例子:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr desired_object_cloud (new pcl::PointCloud<pcl::PointXYZRGB> ());
pcl::ExtractIndices<pcl::PointXYZRGB> extract;
extract.setInputCloud (cloud);
pcl::PointIndices::Ptr cluster_ptr(new pcl::PointIndices(clusters[cluster_idx]));
extract.setIndices (cluster_ptr);
extract.setNegative (false);
extract.filter(*desired_object_cloud);
我正在尝试使用基于表面法线的区域增长来分割输入点云,遵循此处的教程:http://pointclouds.org/documentation/tutorials/region_growing_segmentation.php。 我已经能够为我的用例取得令人满意的结果,我还可以使用 pcl::PointCloud ::Ptr colored_cloud = reg.getColoredCloud ();
可视化这些段但是,我无法找到一种方法来提取包含所有点的法线都指向特定方向的特定聚类,例如,所有点都具有沿 z 轴的点法线的聚类.我假设这样的集群访问应该是可能的,如果我错了请纠正我。此外,获取单个集群的 feature/s 的任何替代方法都会非常有帮助。提前致谢。
看看这些行(来自您提到的教程):
std::vector <pcl::PointIndices> clusters;
reg.extract (clusters);
每个 "cluster" 由 pcl::PointIndices
表示,它只是输入云中 vector<int>
个索引的包装器。
这是一个计算每个簇的平均法线的简单示例:
std::vector<Eigen::Vector3f> mean_normals(clusters.size(), Eigen::Vector3f({ 0.,0.,0. }));
for (auto cluster_idx = 0; cluster_idx < clusters.size(); cluster_idx++)
{
for (auto point_idx: clusters[cluster_idx].indices)
{
mean_normals[cluster_idx] += normals->points[point_idx].getNormalVector3fMap();
}
mean_normals[cluster_idx].normalize();
}
您也可以使用 pcl::PointIndices
使用 pcl::ExtractIndices
、as in this tutorial 为每个集群创建新的云。简短示例:
pcl::PointCloud<pcl::PointXYZ>::Ptr cluster_cloud(new pcl::PointCloud<pcl::PointXYZ>)
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud (cloud);
extract.setIndices (clusters[cluster_idx]);
extract.filter (*cluster_cloud);
您必须将 pcl::PointIndices
的簇转换为 pcl::PointIndicesConstPtr
以将其输入 extract.setIndices()
。这是一个例子:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr desired_object_cloud (new pcl::PointCloud<pcl::PointXYZRGB> ());
pcl::ExtractIndices<pcl::PointXYZRGB> extract;
extract.setInputCloud (cloud);
pcl::PointIndices::Ptr cluster_ptr(new pcl::PointIndices(clusters[cluster_idx]));
extract.setIndices (cluster_ptr);
extract.setNegative (false);
extract.filter(*desired_object_cloud);