PCL点云库(1) — 简介与数据类型

news/2024/4/26 18:47:36/文章来源:https://blog.csdn.net/qq_41921826/article/details/130061851

目录

1.1 简介

1.2 PCL安装

1.2.1 安装方法

1.2.2 测试程序 

1.3 PCL数据类型

1.4 PCL中自定义point类型

1.4.1 增加自定义point的步骤

1.4.2 完整代码


1.1 简介

来源:PCL(点云库)_百度百科

        PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位。

        如《PCL架构图》所示,对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。

1.2 PCL安装

1.2.1 安装方法

安装链接:ubuntu20.04下安装pcl_ubuntu安装pcl_Yuannau_jk的博客-CSDN博客

1.2.2 测试程序 

cmake_minimum_required(VERSION 2.6)
project(pcl_test)find_package(PCL 1.10 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(pcl_test pcl_test.cpp)target_link_libraries (pcl_test ${PCL_LIBRARIES})install(TARGETS pcl_test RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>int main(int argc, char **argv) {std::cout << "Test PCL !!!" << std::endl;pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);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::PointXYZRGB point;point.x = 0.5 * cosf (pcl::deg2rad(angle));point.y = sinf (pcl::deg2rad(angle));point.z = 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;}}point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();point_cloud_ptr->height = 1;pcl::visualization::CloudViewer viewer ("test");viewer.showCloud(point_cloud_ptr);while (!viewer.wasStopped()){ };return 0;
}

1.3 PCL数据类型

在头文件#include <pcl/point_types.h>中包含了所有内置的点云类型,部分如下:

namespace pcl
{/** \brief Members: float x, y, z* \ingroup common*/struct PointXYZ;/** \brief Members: rgba* \ingroup common*/struct RGB;/** \brief Members: intensity (float)* \ingroup common*/struct Intensity;/** \brief Members: intensity (std::uint8_t)* \ingroup common*/struct Intensity8u;/** \brief Members: intensity (std::uint32_t)* \ingroup common*/struct Intensity32u;/** \brief Members: float x, y, z, intensity* \ingroup common*/struct PointXYZI;/** \brief Members: float x, y, z, uin32_t label* \ingroup common*/struct PointXYZL;/** \brief Members: std::uint32_t label* \ingroup common*/...
}

(1)PointXYZ-成员变量:float x, y, z

PointXYZ是使用最常见的一个点数据类型,因为它只包含三维xyz坐标信息,这三个浮点数附加一个浮点数来满足存储对齐,用户可以利用points[i].data[0],或者points[i].x访问点的x坐标值。

(2)PointXYZI-成员变量:float x,y,z,intensity

Point是一个简单的XYZ坐标加intensity的point类型,xyz未与intensity位于同一个结构体。具体说xyz位于一个结构体,内存对齐,intensity位于另一个结构体,内存对齐(填充3个浮点数)。

(3)PointXYZRGBA-成员变量:float x,y,z,uint32_t rgba

rgba包含在一个整型变量中,其余与PointXYZI结构类似。

(4)PointXYZRGB-成员变量:float x,y,z,rgb

rgb信息包含在一个浮点型变量中,其余与PointXYZI结构类似。

(5)InterestPoint-float x,y,z,strength

strength用来表示关键点的强度测量值,其余与PointXYZI结构类似。

(6)Normal-float normal[3], curvature

Norma结构体表示给定点所在样本曲面上的法线方向,以及对应曲率的测量值。

(7)PointNormal-float x,y,z,normal[3], curvature

PointNormal是存储XYZ数据的point结构体,并且包括采样点对应法线和曲率。

(8)PointXYZRGBNormal-float x,y,z,rgb,normal[3], curvature

PointXYZNormal是存储XYZ数据和RGB颜色的point结构体,并且包括采样点曲面法线和曲率。

(9)PointXYZINormal-float x,y,z,intensity,normal[3], curvature

PointXYZNormal是存储XYZ数据和强度值的point结构体,并且包括采样点曲面法线和曲率。

(10)PointWithRange-float x,y,z(union with float point[4], range)

PointWithRange除了range包含从所获得的视点到采样点的距离测量值之外,其余与PointXYZI结构类似。

(11)PointWithViewpoint-float x,y,z,vp_x,vp_y,vp_z

PointWithViewpoint除了vp_x,vp_y,vp_z以三维点表示所获得的视点之外之外,其余与PointXYZI结构类似。

(12)MomentInvariantst-float j1,j2,j3

MomentInvariantst视野更包含采样曲面上面片的三个不变矩的point类型,描述面片上的顶带你分布情况。

(13)PrincipalRadiiRSD-float r_min,r_max

PrincipalRadiiRSD是一个包含曲面块上两个RSD半径的point类型。

(14)Boundary-uint_8 boundary_point

Boundary存储一个点是否位于曲面边界上的简单point类型。

(15)PrincipalCurvatures-float principal_curvature[3],pc1,pc2

PrincipalCurvatures包含给定点主曲率的简单point类型。

(16)PFHSignature125-float pfh[125]

PFHSignature125包含给定点的PFH(点特征直方图)的简单point类型。

(17)FPFHSignature33-float pfh[33]

FPFHSignature33包含给定点的FPFH(快速点特征直方图)的简单point类型。

(18)VFHSignature308-float vfh[308]

VFHSignature308包含给定点的VFH(视点特征直方图)的简单point类型。

(19)Narf36-float x,y,z,rool,pitch,yaw;fooat descriptor[36]

Narf36包含给定点NARF(归一化对齐半径特征)的简单point类型。

(20)BorderDescription-int x,y; BorderTraits traits

BorderDescription包含给定点边界类型的简单point类型。

(21)IntensityGradient-float gradient[3]

IntensityGradient包含给定点强度的梯度point类型。

(22)Histogram-float histogram[N]

Histogram用来存储一般用途的n维直方图。

(23)PointWithScale-float x,y,z,scale

PointWithScale除了scale表示某点用于几何操作的尺度外,其余与PointXYZI结构类似。

(24)PointSufel-float x,y,z,normal[3],rgba,radius,confidence,curvature

PointSufel存储XYZ坐标、曲面法线、RGB信息、半径、可信度和曲面曲率的复杂point类型。

1.4 PCL中自定义point类型

1.4.1 增加自定义point的步骤

(1)首先先进行结构定义

// 定义点类型结构
struct EIGEN_ALIGN16 MyPoint
{PCL_ADD_POINT4D    // 点类型有4个元素 XYZ+paddingPCL_ADD_RGB        //加颜色double time_stamp;    //时间戳EIGEN_MAKE_ALIGNED_OPERATOR_NEW   // 确保new操作符对齐操作
};

 (2)注册到PCL库中

// 注册到PCL库
POINT_CLOUD_REGISTER_POINT_STRUCT(MyPoint,         //注册的结构类型(float, x, x)    //坐标(float, y, y)(float, z, z)(uint32_t,rgba,rgba)    //颜色(double, time_stamp, time_stamp)    //时间戳
);

1.4.2 完整代码

(1)自定义点云类型程序

cmake_minimum_required(VERSION 2.6)
project(mypoint)find_package(PCL 1.10 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(pcl_test pcl_test.cpp)
target_link_libraries (pcl_test ${PCL_LIBRARIES})
install(TARGETS pcl_test RUNTIME DESTINATION bin)
// 方式一:直接写在mypoint.cpp中
#define PCL_NO_PRECOMPILE
#include <iostream>
#include <chrono>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;// 定义点类型结构
struct EIGEN_ALIGN16 MyPoint
{PCL_ADD_POINT4D    // 点类型有4个元素 XYZ+paddingPCL_ADD_RGB        //加颜色double time_stamp;    //时间戳EIGEN_MAKE_ALIGNED_OPERATOR_NEW   // 确保new操作符对齐操作
};// 注册到PCL库
POINT_CLOUD_REGISTER_POINT_STRUCT(MyPoint,         //注册的结构类型(float, x, x)    //坐标(float, y, y)(float, z, z)(uint32_t,rgba,rgba)    //颜色(double, time_stamp, time_stamp)    //时间戳
);double getTimeStamp()
{auto timeNow = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch());return timeNow.count()/1000.0;
}int main(int argc, char *argv[])
{pcl::PointCloud<MyPoint>::Ptr cloud;cloud.reset(new pcl::PointCloud<MyPoint>);cloud->width = 100;cloud->height = 1;cloud->is_dense = false;cloud->points.resize(100);for(auto i = 0; i < 100; i++){// xyzcloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);// rgbcloud->points[i].r = 1024 * rand() / (256);cloud->points[i].g = 1024 * rand() / (256);cloud->points[i].b = 1024 * rand() / (256);cloud->points[i].time_stamp = getTimeStamp();}pcl::io::savePCDFile("mypoint.pcd",*cloud);// to show
#if 0pcl::visualization::CloudViewer viewer("Cloud Viewer");viewer.showCloud<MyPoint>(cloud);
#elsepcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer(renderer, renderWindow, "viewer", false));viewer->addPointCloud<MyPoint>(cloud,color);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4);while (!viewer.wasStopped ()){viewer->spinOnce(100);}
#endifreturn 0;
}

 (2)头文件封装

// 方式二:独立的头文件
#ifndef MYPOINT_H
#define MYPOINT_H
#include<pcl/point_types.h>namespace MYPOINT {struct EIGEN_ALIGN16 _MYPOINT
{PCL_ADD_POINT4DPCL_ADD_RGBdouble time_stamp;EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};struct EIGEN_ALIGN16 MYPOINT : public _MYPOINT
{inline MYPOINT (const _MYPOINT &p){x = p.x; y = p.y; z = p.z; data[3] = 1.0f;rgba = p.rgba;a = 0;time_stamp = p.time_stamp;}inline MYPOINT (){x = y = z = 0.0f;rgba = 0;data[3] = 1.0f;time_stamp = 0;}inline MYPOINT (float _x, float _y, float _z, uint32_t _rgb,double _time_stamp){x = _x; y = _y; z = _z;rgba = _rgb;data[3] = 1.0f;time_stamp = _time_stamp;}friend std::ostream& operator << (std::ostream& os, const MYPOINT& p){os << "(" << p.x << "," << p.y << "," << p.z << "," << p.rgba << ","<< p.time_stamp << ")";return os;}EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
} POINT_CLOUD_REGISTER_POINT_STRUCT(MYPOINT::MYPOINT,(float, x, x)(float, y, y)(float, z, z)(uint32_t,rgb,rgb)(double, time_stamp, time_stamp)
);
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102518.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZLMediaKit流媒体服务器 RTSP推流时候的堆栈

先直接看图 这是ffmpeg向流媒体服务器推流时候的堆栈 引入C 11之后 堆栈会显得特别繁复冗余 看起来 也没有 以前没有C11之前那样 简单明了 太复杂了 标记下 很多函数名字被我改了 因为原来的看起来 同名函数太多了 C11 和lambada 匿名函数 让看堆栈 成了地狱模式 断点断在…

Revit中如何绘制轴线?CAD图纸转轴网操作

一、如何用revit来制作这么一个简单的轴线呢? 01 、新建项目 绘制轴线&#xff0c;首先新建项目建筑样板 02 、轴线快捷键 绘制轴线的快捷键需要牢记&#xff0c;因为经常使用GR 03 、编辑轴线类型 当你画好第一条轴线&#xff0c;需要对轴线类型属性进行调节&#xff0c;一般…

基于tensorflow2.x的多GPU并行训练

由于最近训练transformer&#xff0c;在单卡上显存不够&#xff0c;另外一块卡上也无法加载&#xff0c;故尝试使用双卡并行的策略。将基本的流程、遇见的难题汇总在这里。分布策略解释 使用官方给出的tf.distribute.MirroredStrategy作为分布策略。这个策略通过如下的方式运行…

【架构设计】什么是CAP理论?

1、理论 CAP理论是指计算机分布式系统的三个核心特性&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition Tolerance&#xff09;。 在CAP理论中&#xff0c;一致性指的是多个节点上的数据…

宝安日报:联诚发跨界创新“追光”十九载!

世界一流声光电智造一体化服务商、国家级高新技术企业、国家级专精特新“小巨人”企业、博士后创新实践基地、深圳自主创新百强企业……这些熠熠生辉的关键词&#xff0c;是位于宝安区航城街道的深圳市联诚发科技股份有限公司&#xff08;以下简称&#xff1a;联诚发&#xff0…

KingSCADA3.8保姆级安装教程

大家好&#xff0c;我是雷工&#xff01; 最近开始学习KingSCADA&#xff0c;今天这篇详细记录安装KingSCADA3.8的过程。 首先下载需要的安装版本&#xff0c;此处以从官网下载的最新版本KingSCADA3.8为例&#xff0c;双击&#xff1a;Setup.exe ; 一、安装主程序 1、点击“…

AutoSAR内存映射

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录 为了防止不必要的内存缺口&#xff08;RAM 中未使用的空间&#xff09;&#xff0c;不同大小&#xff08;8、16 和 32 位&#xff09;的变量根据其大小映射到特…

工业树莓派远程I/O控制套装—更高效、更灵活、更便捷

一、背景 在完整的生产过程中&#xff0c;许多传感器设备和执行设备不完全安装在同一位置&#xff0c;大多分散部署在各个生产环节中。如果采用本地控制的方式&#xff0c;就需要用到多个控制器&#xff0c;但是成本较高&#xff0c;且不利于管理&#xff0c;所以最理想的解决…

Vue表单基本操作-收集表单数据

收集表单数据 使用vue中的v-model收集表单里面的数据&#xff0c;不同的表单元素配合v-model会有不同的写法和技巧 本次的表单元素包括&#xff1a;文本框&#xff0c;单选&#xff0c;多选&#xff0c;下拉框&#xff0c;文本域 编写表单元素 首先编写表单元素&#xff0c;…

ROS学习第三十七节——机器人运动控制以及里程计信息显示

https://download.csdn.net/download/qq_45685327/87719766 https://download.csdn.net/download/qq_45685327/87719873 gazebo 中已经可以正常显示机器人模型了&#xff0c;那么如何像在 rviz 中一样控制机器人运动呢&#xff1f;在此&#xff0c;需要涉及到ros中的组件: ros…

camunda的service task如何使用

在 Camunda 中&#xff0c;使用 Service Task 节点可以执行各种类型的业务逻辑&#xff0c;例如计算、数据转换、数据格式化等。在 Service Task 节点中&#xff0c;可以使用不同的编程语言来实现业务逻辑&#xff0c;例如 Java、JavaScript、Python 等。 下面是使用 Java 实现…

状态压缩DP-蒙德里安的梦想

题意 求把 NM 的棋盘分割成若干个 12 的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0c;M4 时&#xff0c;共有 5 种方案。当 N2&#xff0c;M3 时&#xff0c;共有 3 种方案。 如下图所示&#xff1a; 输入格式 输入包含多组测试用例。 每组测试用例占一行&#xff0…

这份最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,你看过没?

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…

【Linux】环境变量与进程优先级知识点

目录 环境变量1.基本概念2.常见环境变量3.我们写的程序和命令行指令有什么区别&#xff1f;4.自己的程序为什么要用 ./ 执行&#xff0c;而命令行指令可以直接执行&#xff1f;5.如何追加环境变量&#xff1f;6.Linux如何查看环境变量7.如何在代码层面获取环境变量main函数的参…

ubuntu 3060显卡驱动+cuda+cudnn+pytorch+pycharm+vscode

文章目录 运行环境&#xff1a;适用&#xff1a;思路&#xff1a;1.1 3060显卡驱动自动安装2.1 CUDA11.1.11)下载CUDA Toolkit 11.1 Update 1 Downloads2)contunue , 然后accept3)回车取消Driver安装&#xff0c;然后install4)添加环境变量5)确认是否安装成功 3.1 cudnn 8.1.11…

【Cartopy基础入门】如何更好的确定边界显示

原文作者&#xff1a;我辈理想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 Cartopy基础入门 【Cartopy基础入门】Cartopy的安装 【Cartopy基础入门】Geojson数据的加载 【Cartopy基础入门】如何更好的确定边界显示 文章目录 Ca…

【边缘计算】登临(Goldwasser-UL64)BW-BR2边缘设备配置指南

目录 开箱配置激活SDK环境测试cuda兼容性 开箱配置 更改盒子root用户密码&#xff1a; sudo passwd root(密码同为root) 切换到root用户身份&#xff1a; su root查看ssh的状态&#xff0c;没有返回说明没有启动 sudo ps -e|grep ssh此时说明ssh服务已启动。 更改ssh配置文…

java定位系统源码,通过独特的射频处理,配合先进的位置算法,可以有效计算出复杂环境下的人员与物品的活动信息

智慧工厂人员定位系统源码&#xff0c;区域电子围栏管控源码 文末获取联系&#xff01; 在工厂日常生产活动中&#xff0c;企业很难精准地掌握访客和承包商等各类人员的实际位置&#xff0c;且无法实时监控巡检人员的巡检路线&#xff0c;当厂区发生灾情或其他异常状况时&#…

postman安装

目录 下载、安装 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 Postman原是Chrome浏览器的插件&#xff0c;可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求 使用Postman还可以在发起请求时&#xff0c;携带一些请求参数、请求头等信息…

WebSocket+Vue+SpringBoot实现语音通话

参考文章 整体思路 前端点击开始对话按钮后&#xff0c;将监听麦克风&#xff0c;获取到当前的音频&#xff0c;将其装化为二进制数据&#xff0c;通过websocket发送到webscoket服务端&#xff0c;服务端在接收后&#xff0c;将消息写入给指定客户端&#xff0c;客户端拿到发送…