官网链接:Point Cloud Library (PCL): Module visualization
参考博客:PCL可视化
一、PCL可视化概述
构建pcl_visualization库的目的是能够快速原型化和可视化对3D点云数据运行的算法的结果。与OpenCV用于显示2D图像和在屏幕上绘制基本2D形状 highgui例程类似,该库提供:
- 用于以 pcl::PointCloud
- 从点集或参数方程中绘制屏幕上的基本3D形状(例如,圆柱体,球体,线条,多边形等)的方法;
- 用于2D绘图的直方图可视化模块(PCLHistogramVisualizer);
- 用于 pcl:😛 ointCloud
- pcl::RangeImage可视化模块。
二、简单点云可视化
CloudView类不能在多线程应用程序中使用,可以通过在类的最前面放下面三行代码解决。
#include
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
#include
#include
#include
#include
int user_data;
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(1.0, 0.5, 1.0);
pcl::PointXYZ o;
o.x = 1.0; o.y = 0; o.z = 0;
viewer.addSphere(o, 0.25, "sphere", 0);
std::cout << "i only run once" << std::endl;
}
void viewerPsycho(pcl::visualization::PCLVisualizer&viewer)
{
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop:" << count++;
viewer.removeShape("text", 0);
viewer.addText(ss.str(), 200, 300, "text", 0);
user_data++;
}
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("./maize.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
viewer.showCloud(cloud);
viewer.runOnVisualizationThreadOnce(viewerOneOff);
viewer.runOnVisualizationThread(viewerPsycho);
while(!viewer.wasStopped())
{
user_data++;
}
return 0;
}
- ubuntu下工具显示
sudo apt-get install pcl-tools #安装pcl_tools
pcl_viewer maize.pcd
三、可视化深度图像
3.1 两种可视化方法
- 3D视窗中以点云形式可视化
- 将深度值映射为不同的颜色,以彩色图方式可视化深度图像
3.2代码示例
#include
#include
#include
#include
using namespace pcl;
using namespace std;
float angular_resolution_x = 0.5f, angular_resolution_y = angular_resolution_x;
RangeImage::CoordinateFrame coordinate_frame = RangeImage::CAMERA_FRAME;
bool live_update = true;
void setViewerPose(pcl::visualization::PCLVisualizer&viewer,const Eigen::Affine3f& viewer_pose)
{
Eigen::Vector3f pos_vector = viewer_pose * Eigen::Vector3f(0, 0, 0);
Eigen::Vector3f look_at_vector = viewer_pose.rotation()*Eigen::Vector3f(0, 0, 1) + pos_vector;
Eigen::Vector3f up_vector = viewer_pose.rotation()*Eigen::Vector3f(0, -1, 0);
viewer.setCameraPosition(pos_vector[0], pos_vector[1], pos_vector[2],
look_at_vector[0], look_at_vector[1], look_at_vector[2],
up_vector[0], up_vector[1], up_vector[2]);
}
int main()
{
angular_resolution_x = deg2rad(angular_resolution_x);
angular_resolution_y = deg2rad(angular_resolution_y);
PointCloud<PointXYZ>::Ptr point_cloud_ptr(new pcl::PointCloud<PointXYZ>);
PointCloud<PointXYZ>& point_cloud = *point_cloud_ptr;
Eigen::Affine3f scene_sensor_pose(Eigen::Affine3f::Identity());
string filename = "room_scan1.pcd";
if(pcl::io::loadPCDFile(filename, point_cloud)==-1)
{
std::cout << "Was not able to open file \"" << filename << "\".\n";
return 0;
}
scene_sensor_pose = Eigen::Affine3f(Eigen::Translation3f(point_cloud.sensor_origin_[0], point_cloud.sensor_origin_[1], point_cloud.sensor_origin_[2]))*Eigen::Affine3f(point_cloud.sensor_orientation_);
float noise_level = 0.0;
float min_range = 0.0f;
float border_size = 1;
RangeImage::Ptr range_image_ptr(new RangeImage);
RangeImage& range_image = *range_image_ptr;
range_image.createFromPointCloud(point_cloud, angular_resolution_x, angular_resolution_y, deg2rad(360.0f), deg2rad(180.0f), scene_sensor_pose, coordinate_frame, noise_level, border_size);
visualization::PCLVisualizer viewer("3D Viewer");
viewer.setBackgroundColor(1, 1, 1);
visualization::PointCloudColorHandlerCustom<PointWithRange> range_image_color_handler(range_image_ptr, 0, 0, 0);
viewer.addPointCloud(range_image_ptr, range_image_color_handler, "range image");
viewer.initCameraParameters();
setViewerPose(viewer, range_image.getTransformationToWorldSystem());
visualization::RangeImageVisualizer range_image_widget("Range Image");
range_image_widget.showRangeImage(range_image);
while (!viewer.wasStopped())
{
range_image_widget.spinOnce();
viewer.spinOnce();
if(!live_update)
{
scene_sensor_pose = viewer.getViewerPose();
range_image.createFromPointCloud(point_cloud, angular_resolution_x, angular_resolution_y,
pcl::deg2rad(360.0f), pcl::deg2rad(180.0f),
scene_sensor_pose, pcl::RangeImage::LASER_FRAME, noise_level, min_range, border_size);
range_image_widget.showRangeImage(range_image);
}
}
}
四、PCLVisualizer可视化类
4.1 简要介绍对于3D视窗的操作:
- Q键退出视窗应用窗口
- R键居中并缩放整个点云
- 使用鼠标左键单击或拖动旋转窗口
- 鼠标滚轮或鼠标右键上下拖动,实现放大缩小
- 滚轮单机或拖动将会移动视窗
4.2 可实现功能
具体代码参考博客:PCL可视化 PCLVisualizer可视化类
- 改变背景颜色改变坐标轴
- 可视化点云颜色特征
- 点云着色
- 可视化点云法线和其它特征
- 绘制普通形状
- 多视口显示
- 自定义交互
; 五、PCLPlotter可视化直方图
PCL官方文档:PCLPloter
PCLPlotter提供一个直接简单的绘图接口,可绘制 二维图形、多项式函数、特征直方图 (FPFH)等。利用PCLPlotter绘图步骤:
- 声明PCLPlotter对象;
- 利用addPlotData()函数添加绘图所需的函数或数据;
- 添加窗口特性。可以调整窗口大小和标题设置;
-
显示绘图。
-
addPlotData函数
利用addPlotData()函数,用户可以为所绘制图形添加用户设定的颜色,如果不进行设置,则绘图对象将会依据颜色表随机赋色 - 绘图效果和MATLAB类似
注:可以绘制函数动画
Original: https://blog.csdn.net/weixin_43949950/article/details/126391060
Author: SUN&LIGHT
Title: 一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/559410/
转载文章受原作者版权保护。转载请注明原作者出处!