在pcl1.8.1版本中,pcl::PointXYZ结构体没有rgb成员变量,因此无法直接设置点的颜色。可以通过创建一个新的点云对象来存储颜色信息,并将其作为参数传递给pcl::visualization::PointCloudColorHandlerCustom类来显示颜色。

以下是修改后的代码示例:

// 将与threejiedian相连的边的顶点设置为绿色
pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
colored_cloud->points.resize(cloud->points.size());
for (size_t i = 0; i < cloud->points.size(); ++i)
{
    colored_cloud->points[i].x = cloud->points[i].x;
    colored_cloud->points[i].y = cloud->points[i].y;
    colored_cloud->points[i].z = cloud->points[i].z;

    colored_cloud->points[i].r = 255;
    colored_cloud->points[i].g = 0;
    colored_cloud->points[i].b = 0;
}

for (const auto& edge : result)
{
    if (std::find(threejiedian.begin(), threejiedian.end(), edge.src) != threejiedian.end() ||
        std::find(threejiedian.begin(), threejiedian.end(), edge.tgt) != threejiedian.end())
    {
        colored_cloud->points[edge.src].r = 0;
        colored_cloud->points[edge.src].g = 255;
        colored_cloud->points[edge.src].b = 0;
        colored_cloud->points[edge.tgt].r = 0;
        colored_cloud->points[edge.tgt].g = 255;
        colored_cloud->points[edge.tgt].b = 0;
    }
}

// 找到y值最大的threejiedian节点
float max_y = std::numeric_limits<float>::min();
int max_y_index = -1;
for (const auto& index : threejiedian)
{
    const auto& point = cloud->points[index];
    if (point.y > max_y)
    {
        max_y = point.y;
        max_y_index = index;
    }
}

// 将y值最大的threejiedian节点用绿色小球显示
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> colored_cloud_color_handler(colored_cloud);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red_color(cloud, 255, 0, 0);
pcl::visualization::PCLVisualizer viewer("Minimum Spanning Tree");
viewer.setBackgroundColor(0, 0, 0);
viewer.addPointCloud<pcl::PointXYZRGB>(colored_cloud, colored_cloud_color_handler, "colored_cloud");
viewer.addPointCloud<pcl::PointXYZ>(cloud, red_color, "original_cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "colored_cloud");
viewer.spin();

// 在y值最大的threejiedian节点上添加一个绿色小球
pcl::ModelCoefficients sphere_coeff;
sphere_coeff.values.resize(4);
sphere_coeff.values[0] = cloud->points[max_y_index].x;
sphere_coeff.values[1] = cloud->points[max_y_index].y;
sphere_coeff.values[2] = cloud->points[max_y_index].z;
sphere_coeff.values[3] = 0.01;  // 设置球的半径为0.01
viewer.addSphere(sphere_coeff, "max_y_sphere");
viewer.spin();

这样修改后的代码将使用pcl::PointXYZRGB结构体来存储点云的坐标和颜色信息,并使用pcl::visualization::PointCloudColorHandlerRGBField类来显示点云的颜色。同时,将颜色修改为RGB格式,可以更灵活地设置点的颜色

在添加新的代码之前需要先包含以下头文件:cpp#include pclvisualizationpoint_cloud_color_handlersh然后在KruskalMST函数的最后添加以下代码:cpp 将与threejiedian相连的边的顶点设置为绿色pclPointCloudpclPointXYZPtr gr

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

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