本文展示了PCL Visualizer的几种基本用法。代码的主体是点云库提供的源代码。由于其是由cmake进行编译,有输入参数的选择问题。为了方便VS的调试运行过程,将其中的输入接口进行了修改:

代码中学习到的几个知识点:

1、int main( int argc, char* argv[] ) 中arg和argv参数的含义;
参考博客:https://blog.csdn.net/dgreh/article/details/80985928
2、注意RGB合成的原理
uint32_t rgb = (static_cast<uint32_t>(r) << 16 |static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
/* \author Geoffrey Biggs */#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/common/common_headers.h>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
// 帮助
void
printUsage(const char* progName)
{std::cout << "\n\nUsage: " << progName << " [options]\n\n"<< "Options:\n"<< "-------------------------------------------\n"<< "-h           this help\n"<< "-s           Simple visualisation example\n"<< "-r           RGB colour visualisation example\n"<< "-c           Custom colour visualisation example\n"<< "-n           Normals visualisation example\n"<< "-a           Shapes visualisation example\n"<< "-v           Viewports example\n"<< "-i           Interaction Customization example\n"<< "\n\n";
}boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{//创建3D窗口并添加点云boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{//创建3D窗口并添加点云  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{//创建3D窗口并添加点云boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)
{//创建3D窗口并添加点云其包括法线  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals, 10, 0.05, "normals");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{//创建3D窗口并添加点云    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();//在点云上添加直线和球体模型viewer->addLine<pcl::PointXYZRGB>(cloud->points[0],cloud->points[cloud->size() - 1], "line");viewer->addSphere(cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");//在其他位置添加基于模型参数的平面及圆锥体pcl::ModelCoefficients coeffs;coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);viewer->addPlane(coeffs, "plane");coeffs.values.clear();coeffs.values.push_back(0.3);coeffs.values.push_back(0.3);coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);coeffs.values.push_back(5.0);viewer->addCone(coeffs, "cone");return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)
{// 创建3D窗口并添加显示点云其包括法线boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->initCameraParameters();int v1(0);viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);viewer->setBackgroundColor(0, 0, 0, v1);viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud1", v1);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("Radius: 0.1", 10, 10, "v2 text", v2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, single_color, "sample cloud2", v2);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");viewer->addCoordinateSystem(1.0);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals1, 10, 0.05, "normals1", v1);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals2, 10, 0.05, "normals2", v2);return (viewer);
}unsigned int text_id = 0;
void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event,void* viewer_void)
{boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);if (event.getKeySym() == "r" && event.keyDown()){std::cout << "r was pressed => removing all text" << std::endl;char str[512];for (unsigned int i = 0; i < text_id; ++i){sprintf(str, "text#%03d", i);viewer->removeShape(str);}text_id = 0;}
}void mouseEventOccurred(const pcl::visualization::MouseEvent &event,void* viewer_void)
{boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);if (event.getButton() == pcl::visualization::MouseEvent::LeftButton &&event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease){std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;char str[512];sprintf(str, "text#%03d", text_id++);viewer->addText("clicked here", event.getX(), event.getY(), str);}
}boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis()
{boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addCoordinateSystem(1.0);viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)&viewer);viewer->registerMouseCallback(mouseEventOccurred, (void*)&viewer);return (viewer);
}
// -----Main-----
int
main(int argc, char** argv)
{// 解析命令行参数printUsage(argv[0]);std::cout << "Input your commend: ";std::string commend;getline(cin, commend);bool simple(false), rgb(false), custom_c(false), normals(false),shapes(false), viewports(false), interaction_customization(false);if (commend == "-s"){simple = true;std::cout << "Simple visualisation example\n";}else if (commend == "-c"){custom_c = true;std::cout << "Custom colour visualisation example\n";}else if (commend == "-r"){rgb = true;std::cout << "RGB colour visualisation example\n";}else if (commend == "-n"){normals = true;std::cout << "Normals visualisation example\n";}else if (commend == "-a"){shapes = true;std::cout << "Shapes visualisation example\n";}else if (commend == "-v"){viewports = true;std::cout << "Viewports example\n";}else if (commend == "-i"){interaction_customization = true;std::cout << "Interaction Customization example\n";}// 自行创建一随机点云pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);std::cout << "Genarating example point clouds.\n\n";// 以椭圆为边线沿z轴拉伸获取其点云,并赋予红绿蓝渐变色。uint8_t r(255), g(15), b(15);for (float z(-1.0); z <= 1.0; z += 0.05){for (float angle(0.0); angle <= 360.0; angle += 5.0){pcl::PointXYZ basic_point;basic_point.x = 0.5 * cosf(pcl::deg2rad(angle));basic_point.y = sinf(pcl::deg2rad(angle));basic_point.z = z;basic_cloud_ptr->points.push_back(basic_point);pcl::PointXYZRGB point;point.x = basic_point.x;point.y = basic_point.y;point.z = basic_point.z;uint32_t rgb = (static_cast<uint32_t>(r) << 16 |static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));point.rgb = *reinterpret_cast<float*>(&rgb);point_cloud_ptr->points.push_back(point);}if (z < 0.0){r -= 12;g += 12;}else{g -= 12;b += 12;}}basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();basic_cloud_ptr->height = 1;point_cloud_ptr->width = (int)point_cloud_ptr->points.size();point_cloud_ptr->height = 1;// 0.05为搜索半径获取点云法线pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;ne.setInputCloud(point_cloud_ptr);pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>());ne.setSearchMethod(tree);pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1(new pcl::PointCloud<pcl::Normal>);ne.setRadiusSearch(0.05);ne.compute(*cloud_normals1);//  0.1为搜索半径获取点云法线pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2(new pcl::PointCloud<pcl::Normal>);ne.setRadiusSearch(0.1);ne.compute(*cloud_normals2);boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;if (simple){viewer = simpleVis(basic_cloud_ptr);}else if (rgb){viewer = rgbVis(point_cloud_ptr);}else if (custom_c){viewer = customColourVis(basic_cloud_ptr);}else if (normals){viewer = normalsVis(point_cloud_ptr, cloud_normals2);}else if (shapes){viewer = shapesVis(point_cloud_ptr);}else if (viewports){viewer = viewportsVis(point_cloud_ptr, cloud_normals1, cloud_normals2);}else if (interaction_customization){viewer = interactionCustomizationVis();}// 主循环while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}
}

PCL库学习笔记(PCL Visualizer)相关推荐

  1. PCL库学习笔记——使用变换矩阵变换点云

    下面的代码通过两种方式生成了变换矩阵,并执行了变换及可视化. #include <iostream>#include <pcl/io/pcd_io.h> #include &l ...

  2. PCL学习笔记-PCL简介

    PCL(点云库)学习笔记 1.简介 点云数据的处理可以采用获得广泛应用的Point Cloud Library(点云库,PCL库). PCL库是一个最初发布于 2013年的开源c++库,它实现了大量点 ...

  3. python xlwings 切片_Python xlwings库学习笔记(1)

    Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...

  4. python标准库学习笔记

    原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...

  5. 深度学习常用python库学习笔记

    深度学习常用python库学习笔记 常用的4个库 一.Numpy库 1.数组的创建 (1)np.array() (2)np.zeros() (3)np.ones() (4)np.empty() (5) ...

  6. Huggingface Transformers库学习笔记(二):使用Transformers(上)(Using Transformers Part 1)

    前言 本部分是Transformer库的基础部分的上半部分,主要包括任务汇总.模型汇总和数据预处理三方面内容,由于许多模型我也不太了解,所以多为机器翻译得到,错误再所难免,内容仅供参考. Huggin ...

  7. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  8. STM32 HAL库学习笔记4-SPI

    STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...

  9. Python_pygame库学习笔记(1):pygame的由来,特点以及模块简介

    Python_pygame库学习笔记 1 Pygame库的由来: Python适合用来开发游戏吗? Pygame的安装 Pygame模块简介 Pygame库的由来: 2000年,作者Pete Shin ...

最新文章

  1. 深度学习原来还可以这么学!
  2. 你面试稳了!通关LeetCode刷题完整攻略,省时又高效
  3. Django models的诡异异常RelatedObjectDoesNotExist
  4. 13 KNN背景分割器
  5. 如何延迟一个 Task 的执行 ?
  6. 深度点评五种常见WiFi搭建方案
  7. JS Math对象(算数、四舍五入、随机数)
  8. Unix——fprintf与stderr、stdout的使用
  9. html5学习笔记(section)
  10. 自旋锁 轻量锁_Java知识进阶-程序员升往架构师必经之路-自旋锁-知识铺
  11. 如何通过U盘等外部设备启动带有T2芯片的Mac?
  12. 3 手风琴翻折效果_vue3+typeScript 手风琴(每周一个小组件)
  13. 外部库依赖以及 编译
  14. linux页表创建与更新
  15. SECS/GEM协议库开发开源代码
  16. 在Android手机上对https请求进行抓包
  17. Unable to find a single main class from the following candidates
  18. 十种常见领带的打法图解
  19. windows编写bat脚本删除隐藏文件夹下的所有文件
  20. 通达信波段王指标公式主图_通达信波段专用主图指标公式

热门文章

  1. springboot集成各类常用中间件(更详细信息请看博主其它文章)
  2. 脚本录制软件python 按键精灵 tc_用动作脚本的方式介绍如何使用按键精灵的录制功能...
  3. Linux网络优化加速一键脚本
  4. 零售数字化转型DTC模式,只是投网红直播吗?
  5. Dapp开发利器--Truffle三剑客之Ganache
  6. ganache-cli环境安装
  7. 电信ADSL+路由器自动拨号设置详细步骤
  8. Redisson实现分布式锁(3)—项目落地实现
  9. java小游戏2048实现
  10. c语言计算阶乘的倒数和,for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和...