版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YunLaowang/article/details/87797967
为了更加直观的显示点云、使点云在视窗中比较容易区分,这里介绍几种PCLVisualizer可视化类的使用方法。
显示点云颜色特征
该方法(PointCloudColorHandlerRGBField)要求点云类型包含RGB三个颜色分量,即该方法是直接显示点云中各个点的RGB属性字段信息,而不是通过对点云着色显示不同颜色。
- 代码
#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<PointXYZRGB>::Ptr cloud(new PointCloud<PointXYZRGB>);
if (io::loadPLYFile("bunny_rgb.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::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "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;
}
- 结果
自定义点云颜色特征
该方法(PointCloudColorHandlerCustom)适用于任何格式点云,不要求点云类型包含RGB三个颜色分量,即将id为"sample cloud"的点云作为一个整体进行着色。
- 代码
#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::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0); // green
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
//viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "sample cloud");// 也可以
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
- 结果
以颜色区别深度
该方法(PointCloudColorHandlerGenericField)将不同的深度值显示为不同的颜色,实现以颜色区分深度的目的;方法PointCloudColorHandlerCustom是将点云作为整体并统一着色,PointCloudColorHandlerGenericField方法是将点云按深度值(“x”、“y”、"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;
}
- 结果
备注:
- 点云源文件"bunny.ply"见:PCL+VS2015实现点云可视化;另外,"bunny_rgb.ply"为遍历"bunny.ply"中所有点并依此着色得到。
- 上述方法并不会修改点云的RGB属性字段,而只是对显示进行渲染的结果。
- 参考:官网教程:PCLVisualizer可视化类。