修改后的代码如下:

pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);
kdtree->setInputCloud(cloud3);
// 定义聚类对象
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.02); // 设置聚类的最大距离阈值
ec.setMinClusterSize(50); // 设置聚类的最小点数
ec.setMaxClusterSize(5000); // 设置聚类的最大点数
ec.setSearchMethod(kdtree);
ec.setInputCloud(cloud3);
// 寻找已知点所属的聚类
std::vector<pcl::PointIndices> cluster_indices;
pcl::PointIndices::Ptr index(new pcl::PointIndices());
//找点云内骨架点的索引index1
int index1;
for (size_t i = 0; i < cloud3->size(); ++i)
{
    if ((*cloud3)[i].x == centroid1.x && (*cloud3)[i].y == centroid1.y && (*cloud3)[i].z == centroid1.z)
    {
        index1 = i;
        break;
    }
}
//std::cout << "该骨架点的索引为: " << index1 << std::endl;

index->indices.push_back(index1); // 将已知点center的索引添加到index中
ec.setIndices(index);
ec.extract(cluster_indices);//cluster_indices索引容器内存储所有簇的索引,按道理应该就只有一个才对,因为我在index里就插了一个起始点,按道理就应该只有一个

// 遍历每个簇的索引
for (size_t i = 0; i < cluster_indices.size(); ++i)
{
    // 获取簇对应的点云
    std::cout << "遍历找到的粗点云索引" << std::endl;
    for (size_t j = 0; j < cluster_indices[i].indices.size(); ++j)
    {
        int index = cluster_indices[i].indices[j];
        pcl::PointXYZ point = (*cloud3)[index];
        yq->push_back(point);
    }
}

主要修改的部分有:

  • 将循环变量的类型int修改为size_t,以避免警告。
  • 修改了cout语句,将endl改为std::endl
  • 修改了第一个循环中的变量名,避免与后续循环中的变量名冲突
修改下列代码中的错误pclsearchKdTreepclPointXYZPtr kdtreenew pclsearchKdTreepclPointXYZ;			kdtree-setInputCloudcloud3;			 定义聚类对象			pclEuclideanClusterExtractionpclPointXYZ ec;			ecsetClusterTolerance002; 设置聚类的最

原文地址: https://www.cveoy.top/t/topic/hY2y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录