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

news2024/9/23 15:19:47

目录

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+padding
    PCL_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+padding
    PCL_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++)
    {
        // xyz
        cloud->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);
        
        // rgb
        cloud->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 0
    pcl::visualization::CloudViewer viewer("Cloud Viewer");
    viewer.showCloud<MyPoint>(cloud);
#else
    pcl::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);

    }
#endif

    return 0;
}

 (2)头文件封装

// 方式二:独立的头文件
#ifndef MYPOINT_H
#define MYPOINT_H
#include<pcl/point_types.h>

namespace MYPOINT {

struct EIGEN_ALIGN16 _MYPOINT
{
    PCL_ADD_POINT4D
    PCL_ADD_RGB
    double 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.coloradmin.cn/o/452745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue组件间通信的7种方法(全)

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进…

6.4 一阶方程组与高阶方程的数值解法

学习目标&#xff1a; 学习一阶方程组与高阶方程的数值解法的目标可以分为以下几个方面&#xff1a; 掌握一阶方程组和高阶方程的基本概念和求解方法&#xff1b;理解数值解法的概念和原理&#xff0c;了解常见的数值解法&#xff1b;掌握欧拉方法、改进欧拉方法和龙格-库塔方…

Viu联合华为HMS生态,共创影音娱乐新体验

华为HMS生态携手流媒体平台Viu&#xff0c;为海外消费者打造精品移动娱乐应用体验&#xff0c;并助力提升流量变现能力。Viu在中东非、东南亚等16个国家及地区提供广告合作和付费会员服务&#xff0c;支持优质视频内容高清点播和直播。自2019年起&#xff0c;Viu在中东非区域与…

Windows下版本控制器(SVN)-TortoiseSVN使用

文章目录 基础知识-Windows下版本控制器(SVN)3.4 TortoiseSVN使用3.4.1 SVN检出(SVN Checkout)3.4.2 SVN更新(SVN Update)3.4.3 **SVN**提交(SVN Commit)3.4.4 **SVN**还原(SVN Revert)3.4.5 解决文件冲突3.4.6 授权访问3.4.7 **显示日志(Show log)**3.4.8 **版本库浏览(Repo-b…

Java项目上线之服务器环境配置篇(二)——Tomcat配置

Java项目上线之服务器环境配置篇&#xff08;二&#xff09;——Tomcat配置 Tomcat的选择&#xff1a; 云服务器tomcat的选择最好与本机项目运行的tomcat版本号一致&#xff0c;避免一些不必要的问题。 配置步骤&#xff1a; 1、首先进入云服务器创建好放置tomcat的文件夹。这…

台灯发光方式哪种好?分享好用侧发光的护眼台灯

台灯发光方式主要是侧发光、直发光方式。个人觉得侧发光的台灯会比较好。 侧发光灯主要利用导光板技术&#xff0c;根据led灯板灯珠的排布以及灯珠的发光角度进行导光板网点设计&#xff0c;使光线通过导光板达到亮度均匀化的效果。 而直发光灯以高亮度led为发光源&#xff0…

手势语言识别模型训练及应用

使用训练集训练模型&#xff0c;使模型能够识别不同手势。 OpenCV-Python环境使用训练集训练模型&#xff0c;使模型能够识别不同手势。系统测试 本项目基于卷积神经网络&#xff0c;通过Python的翻转功能沿垂直轴翻转每个图像&#xff0c;实现手势语言识别的功能。系统流程如图…

FL Studio21最新中文版安装包下载操作教程

FL Studio21是一款非常流行的数字音频工作站(DAW)软件,用于音乐制作、录音、调整和混音。它由Image-Line公司开发,前身叫FruityLoops,后改名为FL Studio。 FL Studio21的主要功能包括: 1. MIDI编序器:用于录入和编辑MIDI音序,控制软件乐器和外部硬件。 2. 虚拟乐器:提供各种模…

matrix部署

一、环境描述 首先matrix是一个去中心化的聊天服务&#xff0c;matrix实现了端对端的加密&#xff0c;这意味着不仅其他人无法查看你的聊天内容&#xff0c;哪怕你更换了一个终端&#xff0c;你也需要私钥才能够查看你的聊天记录。 这是终极的隐私保护方案&#xff0c;因为一旦…

【Python_Matplotlib学习笔记(二)】Matplotlib绘图嵌入PySide2图形界面

Matplotlib绘图嵌入PySide2图形界面 前言正文1、FigureCanvasQTAgg类介绍2、基于FigureCanvasQTAgg类实现Matplotlib绘图嵌入PySide2图形界面3、示例代码及实现效果 前言 在本文中主要介绍 如何基于 FigureCanvasQTAgg 类实现 Matplotlib 绘图嵌入 PySide2 图形界面。 正文 …

全栈工程师的职业前景及就业环境情况说明

本篇文章主要讲解全栈工程师的职业前景和就业趋势。 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月20日 全栈工程师顾名思义就是会一个技术栈领域的所有客户端技术&#xff0c;如web全栈即前后端技术栈都会的工程师&#xff0c;如web、pc、app都会的则也是全栈&#xff08…

电脑清理C盘记录

从30几G扩大到了50G。 进行了虚拟内存的移动。 来自C盘清理最全攻略&#xff0c;用这几招轻松解决&#xff0c;不存在C盘爆红 我就使用系统管理的大小没有更改了&#xff0c;这也方便改回去叭。 可能会出现警告&#xff0c;不用管。 把桌面移动到了D盘。 文件夹桌面右键属性…

初识Android内存优化

一、简介 Android 内存优化是指优化 Android 应用程序的内存使用&#xff0c;以减少可用内存的消耗&#xff0c;提高应用程序的性能和可靠性。Android 内存优化可以通过减少内存使用量&#xff0c;减少对资源的消耗&#xff0c;以及提高内存利用率来实现。 安卓系统对每个应用…

【音视频第16天】详解STUN协议

一个webRTC传输协议搞得自己云里雾里的。现在主动攻克一下。先看看STUN协议。好&#xff0c;我们开始吧 目录 1.讲讲什么是NAT&#xff1f;2.NAT有啥问题&#xff1f;3.四种NAT类型4.STUN Server5.TURN ServerSTUN和TURN的实现&#xff1a;什么是STUN&#xff1f;为什么需要ST…

中台产品经理02:产品经理如何用一套方法搞定复杂业务拆解?

如果你问我作为企业级应用的产品经理日常工作最大的感受是什么&#xff1f;那就是经常会需要面对众多复杂类业务需求。 原因其实很好理解&#xff0c;B端产品通常需要支持更复杂的业务流程&#xff0c;需求也更加个性化和细分。例如&#xff0c;银行业务系统、医院管理系统、物…

JVM中的垃圾回收概念及其基础算法说明

文章目录 一、 垃圾回收概述1、什么是垃圾&#xff1f;2、为什么我们需要GC 二、垃圾回收之判别对象死活1、标记阶段&#xff1a;引用计数算法2、标记阶段&#xff1a;可达性分析算法 二、 finalization 机制三、整理和清除对象1、标记-清除算法&#xff08;Mark-Sweep&#xf…

Selenium安装及环境配置

目录 一、Selenium 简介1. 组件2. 特点 二、安装Selenium✨三、下载对应版本的Chromedriver1.查看Chrome的版本号2.下载驱动 chromedriver和配置3.解压到本地4.复制文件放入python安装目录的Scripts文件夹中5.Selenium启动Chrome 一、Selenium 简介 1. 组件 Selenium IDE&…

【Few Shot数据集】CUB-200-2011 鸟类

文章目录 一、数据下载二、数据介绍3.1 图案示意3.2 标注属性 CUA-200-2011 是CUB-200的拓展&#xff0c;包含了200个鸟类&#xff0c;共11788张图片&#xff0c;每张图片都标注了物体的框、关键点和属性类别&#xff0c;常被用于小样本细粒度图像分类或者检测任务中。 一、数据…

java运动会成绩管理系统dzkf0534程序

借助java编程语言、jsp技术、MySQL数据库和tomcat服务器来完成系统的所有功能&#xff0c;最后进行系统测试&#xff0c;来检测系统的权限和漏洞&#xff0c;从而将系统完善&#xff0c;达到符合标准。 &#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff…

数据库基础篇 《4. 运算符》

目录 1. 算术运算符 1&#xff0e;加法与减法运算符 2&#xff0e;乘法与除法运算符 3&#xff0e;求模&#xff08;求余&#xff09;运算符 2. 比较运算符 1&#xff0e;等号运算符 2&#xff0e;安全等于运算符 3&#xff0e;不等于运算符 4. 空运算符 5. 非空运算…