目录
一、概述
1.1原理
1.2实现步骤
1.3 应用场景
二、代码实现
2.1关键函数
2.2完整代码
三、实现效果
PCL点云算法汇总及实战案例汇总的目录地址链接:
PCL点云算法与项目实战案例汇总(长期更新)
一、概述
本文将介绍如何使用PCL库基于点云的高程(即点的Z坐标)来渲染颜色。高程渲染是一种根据点云中每个点的高度(Z值)来分配颜色的方法,可以帮助用户更直观地理解和分析点云数据中的高度变化。
1.1原理
高程渲染通过将点云中每个点的Z坐标值映射为颜色,实现对高度的可视化。通常,较低的Z值映射为冷色调(如蓝色),较高的Z值映射为暖色调(如红色)。通过这种方式,可以直观地展示点云中高度的分布情况,特别是在地形分析、建筑测绘等应用中非常有用。
1.2实现步骤
- 读取点云数据,并将其转换为 pcl::PointCloud 类型。
- 遍历点云中的每个点,根据其Z坐标值计算对应的颜色。
- 将计算得到的颜色值分配给每个点。
- 使用PCL可视化工具显示基于高程渲染颜色的点云数据。
1.3 应用场景
- 地形分析:通过高程渲染,可以直观地展示地形的起伏变化,帮助分析地形特征。
- 建筑测绘:在建筑物扫描中,基于高程的渲染可以显示建筑物的高度分布。
- 环境监测:用于监测和可视化森林、山脉等自然环境的高度分布。
二、代码实现
2.1关键函数
1.颜色映射与分配:
-pcl::PointCloud<pcl::PointXYZRGB>:用于存储带有颜色信息的点云数据。
-颜色映射:根据点的Z坐标值计算颜色,并分配给点云中的每个点。
2.点云数据加载与可视化:
-pcl::io::loadPCDFile:用于加载PCD格式的点云文件。
-pcl::visualization::PCLVisualizer:创建一个可视化窗口,并显示点云数据。
2.2完整代码
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <algorithm> // 包含std::min_element和std::max_elementint main(int argc, char** argv)
{// 1. 创建PointCloud对象,用于存储带有颜色信息的点云数据pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);// 2. 读取点云数据pcl::PointCloud<pcl::PointXYZ>::Ptr inputCloud(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile("input.pcd", *inputCloud) == -1) // 加载点云文件{PCL_ERROR("Couldn't read file input.pcd \n");return -1;}// 3. 计算点云的最小和最大Z值auto minmax_z = std::minmax_element(inputCloud->points.begin(), inputCloud->points.end(),[](const pcl::PointXYZ& p1, const pcl::PointXYZ& p2) {return p1.z < p2.z;});float min_z = minmax_z.first->z;float max_z = minmax_z.second->z;// 4. 将原始点云转换为带有颜色信息的点云cloud->width = inputCloud->width;cloud->height = inputCloud->height;cloud->is_dense = inputCloud->is_dense;cloud->points.resize(cloud->width * cloud->height);for (size_t i = 0; i < inputCloud->points.size(); ++i){cloud->points[i].x = inputCloud->points[i].x;cloud->points[i].y = inputCloud->points[i].y;cloud->points[i].z = inputCloud->points[i].z;// 计算颜色值,基于Z值进行映射float normalized_z = (inputCloud->points[i].z - min_z) / (max_z - min_z);cloud->points[i].r = static_cast<uint8_t>(255 * normalized_z); // 红色分量cloud->points[i].g = static_cast<uint8_t>(255 * (1.0f - normalized_z)); // 绿色分量cloud->points[i].b = 128; // 固定蓝色分量,或根据需要调整}// 5. 创建PCLVisualizer对象,用于显示点云数据pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0); // 设置背景颜色为黑色viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "elevation colored cloud"); // 添加带有高程渲染颜色的点云viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "elevation colored cloud"); // 设置点的大小// 6. 启动可视化主循环while (!viewer->wasStopped()){viewer->spinOnce(100); // 让可视化窗口刷新}return 0;
}