- 刚刚在网上搜了一下,使用 PCL 库,根据点云数据的强度的大小,对点云进行着色的程序,并没有找到特别合适的,于是我参考网上的一个教程,稍微改写了一下。
-
参考链接:
PCL可视化点云颜色特征
- 参考根据 z 坐标值着色的程序:
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace std;
using namespace pcl;
using namespace io;
int main() {
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
if (io::loadPLYFile("bunny.ply", *cloud) == -1) { // 读取.ply文件
cerr << "can't read file bunny.pcd" << endl;
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// 关键语句
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z"); // 按照z字段进行渲染
viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); // 设置点云大小
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
- 其中关键的语句就是
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z"); // 按照z字段进行渲染
- 将其中的 ‘z’ 改为 ‘intensity’ 即可
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "intensity"); // 按照 intensity 强度字段进行渲染
- 完整程序
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace std;
using namespace pcl;
using namespace io;
int main() {
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
if (io::loadPLYFile("bunny.ply", *cloud) == -1) { // 读取.ply文件
cerr << "can't read file bunny.pcd" << endl;
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// 关键语句
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "intensity"); // 按照 intensity 强度字段进行渲染
viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); // 设置点云大小
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
- 注意:以上程序我并没有运行过,因为我导入的不是 ply 文件,我用的是 .pcd 文件,但是替换以上一些关键语句之后,发现可以使用
- 以下程序是我使用的着色函数,可以参考
// 按强度可视化 1 个点云着色
void VisualClouds(pcl::PointCloud<pcl::PointXYZI>::Ptr &cloud_src)
{
// 创建1个可视化窗口
boost::shared_ptr<pcl::visualization::PCLVisualizer> MView (new pcl::visualization::PCLVisualizer ("My program"));
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> fildColor(cloud_src, "intensity"); // 按照intensity字段进行渲染
int v1(0);
MView->createViewPort (0.0, 0.0, 1, 1.0, v1);
MView->setBackgroundColor (0.3, 0.3, 0.3, v1);
MView->addText ("Raw point clouds", 10, 10, "v1_text", v1);
MView->addPointCloud<pcl::PointXYZI> (cloud_src, fildColor, "sample cloud",v1);
MView->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud", v1); // 设置点云大小
MView->spin();
}
- 使用的时候直接在主函数调用即可:VisualClouds(test);
版权声明:本文为m0_52162112原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。