点云渲染及可视化 (pcl::visualization)

PCLVisualizer视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer 更为复杂,具有更全面的功能,如显示法线、点云着色、绘制多种形状和开辟多个视口。


点云素材:bunny.txt

1、按照点云坐标x、y、z坐标值中字段给点云进行赋值渲染

void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  pcl::visualization::PCLVisualizer viewer("cloud");
  viewer.setBackgroundColor(0, 0, 0); // 设置背景色,RGB,0~1
	
  pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "x"); // 按照x字段进行渲染
  viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample"); // 显示点云,其中fildColor为颜色显示
  viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
 
  while (!viewer.wasStopped()) {
    viewer.spinOnce();
  }
}

// // event loop
/ Each call to spinOnce gives the viewer time to process events, allowing it to be interactive.
// while (!viewer->wasStopped()) {
//   viewer->spinOnce(100);
//   boost::this_thread::sleep(boost::posix_time::microseconds (100000));
// }

2、给点云单独赋予某一颜色

void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  pcl::visualization::PCLVisualizer viewer("cloud");
  viewer.setBackgroundColor(0, 0, 0);

  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> singleColor(cloud, 0,255,0); // 0-255,设置成绿色
  viewer.addPointCloud<pcl::PointXYZ>(cloud, singleColor, "sample"); // 显示点云,其中fildColor为颜色显示
  // viewer.addPointCloud<pcl::PointXYZ>(cloud, "sample");
  // viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, 0,1,0, "sample");
  viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
 
  while (!viewer.wasStopped()) {
    viewer.spinOnce();
  }
}

3、随机生成颜色

void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  pcl::visualization::PCLVisualizer viewer("cloud");
  viewer.setBackgroundColor(0, 0, 0);

  pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> RandomColor(cloud); // 随机给点云生成颜色
  viewer.addPointCloud<pcl::PointXYZ>(cloud, RandomColor, "sample"); // 显示点云,其中fildColor为颜色显示
  viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
 
  while (!viewer.wasStopped()) {
    viewer.spinOnce();
  }
}

4、可视化彩色点云

void visualization(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud) {
  pcl::visualization::PCLVisualizer viewer("cloud");
  viewer.setBackgroundColor(0, 0, 0);

  pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> fildColor(cloud);
  viewer.addPointCloud<pcl::PointXYZRGB>(cloud, fildColor, "sample");
  viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
 
  while (!viewer.wasStopped()) {
    viewer.spinOnce();
  }
}

5、添加坐标系、箭头、相机视角

void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  pcl::visualization::PCLVisualizer viewer("cloud");
  viewer.setBackgroundColor(0, 0, 0); // 设置背景色,RGB,0~1

  pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "x"); // 按照x字段进行渲染
  viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample");
  viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置标签点云的大小
   viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.9, "sample"); // 设置标签点云的不透明度

  viewer.addCoordinateSystem(0.05); // 添加坐标系,并设置比例
  viewer.initCameraParameters(); // 通过设置照相机参数使得从默认的角度和方向观察点云
  
  Eigen::Vector4f centroid;
  pcl::compute3DCentroid(*cloud, centroid);
  pcl::PointXYZ p1(centroid[0], centroid[1], centroid[2]);
  pcl::PointXYZ p2(centroid[0], centroid[1] + 0.03, centroid[2]);
  viewer.addArrow(p2, p1, 1, 0, 0, false); // 添加箭头
 
  while (!viewer.wasStopped()) {
    viewer.spinOnce();
  }
}

6、多视角显示(PCL visealizer可视化类允许用户通过不同的窗口(Viewport)绘制多个点云方便点云比较)

void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  pcl::visualization::PCLVisualizer viewer("cloud");

  int v1(0); // 创建新的视角
  viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1); // 4个参数分别是X轴的最小值,最大值,Y轴的最小值,最大值,取值0-1,v1是标识
  viewer.setBackgroundColor(0, 0, 0, v1); // 设置视口的背景颜色
  viewer.addText("x colored cloud", 10, 10, "v1 text", v1); // 添加文本

  pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "x");
  viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "v1 cloud");
  viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "v1 cloud");

  // 对第二视口做同样的操作,使得做创建的点云分布于右半窗口,将该视口背景赋值于灰色,以便明显区别,虽然添加同样的点云,给点云自定义颜色着色
  int v2(0);
  viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);
  viewer.setBackgroundColor (0.3, 0.3, 0.3, v2);
  viewer.addText("green cloud", 10, 10, "v2 text", v2);

  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> singleColor(cloud, 0, 255, 0);
  viewer.addPointCloud<pcl::PointXYZ>(cloud, singleColor, "v2 cloud", v2);
  viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "v2 cloud");

  while (!viewer.wasStopped()) {
    viewer.spinOnce();
  }
}

 主函数

#include <pcl/common/centroid.h>
#include <pcl/visualization/pcl_visualizer.h>

void CreateCloudFromTxt(const std::string& file_path,
                        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  std::ifstream fin(file_path.c_str());
  std::string line;
  pcl::PointXYZ point;
  while (getline(fin, line)) {
    std::stringstream ss(line);
    ss >> point.x;
    ss >> point.y;
    ss >> point.z;
    cloud->push_back(point);
  }
  fin.close();
}

int main(int argc, char**argv) {
  // 加载点云模型
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  CreateCloudFromTxt("/tmp/bunny.txt", cloud);

  // 点云渲染和可视化
  visualization(cloud);
  
  return 0;
}

在使用PCL点云库进行可视化的时候,可以通过键盘控制显示情况,在可视化窗口按h键可以查看。

参考:

http://www.pclcn.org/study/news.php?lang=cn&class1=85&class2=102&class3=105&page=4

PCL可视化窗口的键盘控制

猜你喜欢

转载自blog.csdn.net/A_L_A_N/article/details/108060859