PCL库点云小知识

2023-05-16

1.计算极值点

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common.h>

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ> ("your_pcd_file.pcd", *cloud);

pcl::PointXYZ minPt, maxPt;
pcl::getMinMax3D (*cloud, minPt, maxPt);

#例如获取最大、最小的x值
float max_x=maxPt.x;
float min_x=minPt.x;

2.从点云数据中删除和添加点

#include <pcl/io/pcd_io.h>
#include <pcl/common/impl/io.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("your_pcd_file.pcd", *cloud);

#1.删除指定位置的点
pcl::PointCloud<pcl::PointXYZ>::iterator index=cloud->begin();
cloud->erase(index);//删除第一个
index=cloud->begin()+5;//删除第5个,???不是第6个吗?从0开始??

#2.在指定位置添加点
pcl::PointXYZ point={1,1,1};
cloud->insert(cloud->begin()+5,point);//在索引号为5的位置1上插入一点,原来的点后移一位

#3.在最后添加点
cloud->push_back(point);

3.1不同类型点云的相互转换

#方法1.使用pcl自带的函数转换
 PointCloud<PointXYZ> cloud_xyz;
 PointCloud<PointXYZRGB> cloud_xyzrgb;
copyPointCloud(cloud_xyz, cloud_xyzrgb);//将xyz形式点云转换成xyzrgb形式

#方法2.直接赋值
cloud_xyzrgb.points.resize(cloud_xyz.size());
 for (size_t i = 0; i < cloud_xyz.points.size(); i++) {
    cloud_xyzrgb.points[i].x = cloud_xyz.points[i].x;
    cloud_xyzrgb.points[i].y = cloud_xyz.points[i].y;
    cloud_xyzrgb.points[i].z = cloud_xyz.points[i].z;
 }

3.2点对象不同定义方式的相互转换
(类似pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换)

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud = *cloudPtr;//由Ptr转变为另一种类型
cloudPtr = cloud.makeShared();//转变为Ptr类型
///注意**:一般常用pcl::PointCloud::Ptr,因为kdtree和octree类中的setInputCloud()函数只支持pcl::PointCloud::Ptr类型

4.知道了要保存的点云索引,如何从原点云中只保存需要的索引数据到新点云

#include <pcl/io/pcd_io.h>
#include <pcl/common/impl/io.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("your_pcd_file.pcd", *cloud);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZ>);

std::vector<int> indexs={1,2,5}; //索引
pcl::copuPointCloud(*cloud,indexs,*cloudOut);//保存到新点云

5.如何删除无效点(某一个值为nan的点)

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr output(new pcl::PointCloud<pcl::PointXYZ>);

vector<int> indices;
pcl::removeNaNFromPointCloud(*cloud,*output,indices);
pcl::io::savePCDFile("out.pcd",*output);

6.1使用flann kdtree 查询k近邻
(如果被查询点在该点云中,那么第一个近邻为它本身)


#include <pcl/kdtree/kdtree_flann.h>
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree; //创建KDtree
kdtree.setInputCloud (cloud);//输入点云
int k=10;//查询的近邻点个数为10
pcl::PointXYZ searchPoint={1,1,1};
std::vector<int> pointIdxNKNSearch(k); //存储近邻点集的索引
std::vector<float>pointNKNSquareDistance(k); //近邻点集距离的平方值
//size值即为查询到的k近邻点个数
int size=kdtree.nearestKSearch(searchPoint,k,pointIdxNKNSearch,pointNKNSquareDistance);
//如果size>0,则可以通过存储的索引对近邻点云进行提取

6.2使用flann kdtree 查询r范围近邻

#include <pcl/kdtree/kdtree_flann.h>
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree; //创建KDtree
kdtree.setInputCloud (cloud); //输入点云
float radius=0.5;//查询的近邻点的距离
pcl::PointXYZ searchPoint={1,1,1};
std::vector<int> pointIdxRadiusSearch; //存储近邻点集的索引
std::vector<float>pointNRSquareDistance; //近邻点集距离的平方值
//size值即为查询searchPoint点在radius范围内近邻点的个数
int size=kdtree.radiusSearch(searchPoint,radius,pointIdxRadiusSearch,pointNRSquareDistance);
//如果size>0,则可以通过存储的索引对近邻点云进行提取

7.计算点云的平均密度

//创建一个快速k近邻查询,查询的时候若该点在点云中,则第一个近邻点是其本身
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;  
kdtree.setInputCloud(cloud);//输入点云
int k =2;
float everagedistance =0;
//为什么要使用cloud->size()/2个点,而不是全部点???
for (int i =0; i < cloud->size()/2;i++)
{
    vector<int> indices ;
    vector<float> squaredistance;
    kdtree.nearestKSearch(cloud->points[i],k,indices,squaredistance);
    everagedistance += sqrt(squaredistance[1]);
}
everagedistance = everagedistance/(cloud->size()/2);
cout<<"everage distance is : "<<everagedistance<<endl;

8.质心计算

Eigen::Vector4f centroid;  //质心
pcl::compute3DCentroid(*cloud,centroid); //估计质心的坐标
float centroid_x=centroid(0);
float centroid_y=centroid(1);
float centroid_z=centroid(2);

9.时间计算

#include <pcl/console/time.h>
pcl::console::TicToc time; time.tic(); //开始计时
//你的程序片段 
cout<<time.toc()/1000<<"s"<<endl;//结束计时

10.使用vector存储点云
在分割后常有多个簇,使用点云索引存储被分割后的多个簇在迭代读取时容易出现问题,若循环迭代的输入点云发生了变化,得到的子点云索引是新输入点云中的索引,并非最初的输入点云的索引,因此最可靠的方法是将子点云存入向量。

//点云向量的定义方式
std::vector<pcl::PointCloud<pcl::PointXYZ>, Eigen::aligned_allocator<pcl::PointXYZ>> clouds_vector;
clouds_vector.push_back(cloud);  //将待保存点云存入向量。

注:ply文件不仅可以存储点信息,而且可以存储网格数据. 用emacs打开一个ply文件,观察表头,如果表头element face的值为0,则表示该文件为点云文件,如果element face的值为某一正整数N,则表示该文件为网格文件,且包含N个网格.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCL库点云小知识 的相关文章

  • 【FineReport企业日常问题 2.0】FineReport(帆软设计器)如何连接远程的服务器?

    问题描述 FineReport 报表正式工程一般都部署在远程服务器上 xff0c 这里部署的是linux系统上的 xff0c 一般开发都是直连服务器进行报表设计的 然后开发完后集成到其他的系统上面 一般都会有测试报表 xff0c 和正式报表
  • 【钰言又止】

    钰言又止 看到在名古屋买的风铃 发出悦耳的声音 如同你温柔的唤醒 我慵懒的回应 天正好放晴 适合去看海边的风景浪花里你身姿娉婷 我们依偎成一道林荫 而现在和回忆平行 我已经分不清 在梦中的幻影 触碰再轻 也像是划破夜空的流星 转瞬即逝的光明
  • mysql:In aggregated query without GROUP BY, expression #1 of SELECT list contains...........

    文章目录 问题描述问题溯源解决方式一解决方法二附录 xff1a 问题描述 下面是报错截图 xff1a span class token number 1140 span In aggregated query without GROUP B
  • 【FineReport企业日常问题 3.0】帆软Finereport跨大版本打开设计文件(包括cpt,frm等)

    文章目录 场景分析探索实现方法在这里插入图片描述总结 场景 一般我们做报表开发的时候 xff0c 帆软服务器上的版本 包括小版本 最好和本地设计器的版本一致 xff0c 但是随着帆软版本升级换代 xff0c 目前已经是v11版了 之前的有v
  • 【node.js】关于node.js,如何解决npm should be run outside of the Node.js REPL, in your normal shell报错?

    问题描述 前言 xff0c 安装node方式采用的是安装包解压的 报如下错误 npm should be run outside of the Node js REPL in your normal shell 在windows环境下安装完
  • 【Mysql第一期 数据库概述】

    文章目录 1 为什么要使用数据库2 数据库与数据库管理系统2 1 数据库的相关概念2 2 数据库特点2 3SQL优点 3 常见的数据库介绍1 Oracle2 SQL Server3 MySQL4 Access5 DB26 PostgreSQ
  • 【Mysql第二期 MySQL环境搭建】

    文章目录 01 为什么要安装新版本 xff1f 02 官网下载mysql03 安装配置初始化mysql 04 查看 MySQL服务05 验证是否安装成功06 修改root密码07 如果有navicat工具可以在测试一下 xff1a 01 为
  • 【Mysql第三期 基本查询语句结构】

    文章目录 1 SQL概述1 1 SQL背景知识1 2SQL 分类 2 SQL语言的规则与规范2 1 基本规则2 2 SQL大小写规范 xff08 建议遵守 xff09 2 3 注 释2 4 命名规则 xff08 暂时了解 xff09 3 基
  • 【Mysql第四期 运算符规则计算】

    文章目录 写在前面1 算数运算符2 比较运算符3 逻辑运算符4 位运算符5 运算符的优先级拓展 xff1a 使用正则表达式查询 写在前面 基本的运算符号在计算机编程领域都是相通的 xff0c 会有自己的一些特定符号语言 xff0c 就像是各
  • 【Mysql第五期 排序与分页】

    文章目录 案例使用的数据脚本1 排序数据1 1 排序规则1 2 单列排序1 3 多列排序 2 分页2 1 需求2 2 实现规则 3 课后习题扩展分析原因问题解决总结 案例使用的数据脚本 1 mysql脚本下载链接https download
  • jeston TX1_TX2 ubuntu18.04安装(国内安装源gitee)ROS Melodic

    查看ubunut系统信息 cat proc version uname a lsb release a 我自己的系统信息是 xff1a 由于我自己已经迁移了系统至SD卡 xff0c 所以存储比较富裕 xff1a 通过对应的ubuntu版本安
  • 【Mysql第六期 多表连接查询】

    文章目录 1 了解什么是笛卡尔积 xff08 或交叉连接 xff09 2 多表连接分类3 非等值连接4 UNION的使用7 MySQL的七种join图解8 课后习题 1 了解什么是笛卡尔积 xff08 或交叉连接 xff09 笛卡尔乘积是一
  • 【Mysql第七期 函数】

    文章目录 1 函数的理解1 1 什么是函数1 2 不同DBMS函数的差异 2 数值函数2 3 三角函数2 5 进制间的转换 3 字符串函数常用函数 4 日期和时间函数4 1 获取日期 时间4 2 日期与时间戳的转换4 3 获取月份 xff0
  • 【Mysql第八期 子查询】

    文章目录 前言1 需求分析与问题解决1 2 子查询的基本使用1 3 子查询的分类 2 单行子查询2 1 单行比较操作符2 2 代码示例2 5 子查询中的空值问题 3 多行子查询3 1 多行比较操作符3 2 代码示例3 3 空值问题 4 相关
  • 【Mysql第九期 建表语句和管理表】

    文章目录 1 基础知识1 1 一条数据存储的过程1 2 标识符命名规则1 3 MySQL中的数据类型 2 创建和管理数据库2 2 使用数据库2 3 修改数据库2 4 删除数据库 3 创建表3 2 创建方式23 3 查看数据表结构 4 修改表
  • 【Mysql第十期 数据类型】

    文章目录 1 MySQL中的数据类型2 类型介绍2 2 可选属性2 2 2 UNSIGNED2 2 3 ZEROFILL2 3 适用场景2 4 如何选择 xff1f 3 浮点类型3 2 数据精度说明3 3 精度误差说明 4 定点数类型4 1
  • 【Mysql第十一期 约束】

    文章目录 1 约束 constraint 概述1 1 为什么需要约束1 2 什么是约束1 3 约束的分类 2 非空约束2 1 作用2 2 关键字2 3 特点2 4 添加非空约束2 5 删除非空约束 3 唯一性约束3 1 作用3 2 关键字3
  • 【Mysql第十二期 视图】

    文章目录 1 常见的数据库对象2 视图概述2 1 为什么使用视图 xff1f 2 2 视图的理解 3 大白话理解3 1 创建单表视图3 2 创建多表联合视图 4 查看视图5 更新视图的数据5 1 一般情况 6 修改 删除视图6 1 修改视图
  • 【presto sql】presto sql 如何通过 计算当前日期(年月日,时分秒) 来计算当前是星期几?

    文章目录 原因解析常见的日期处理方式拓展 原因 presto没有直接的日期转星期几的方式 xff0c 但是可以通过函数mod xff0c date diff多种函数进行求模转换成我们想要的星期几 span class token keywo
  • 【presto】presto如何对字段换行处理?chr(10)

    文章目录 问题描述问题分析什么是ASCII码presto sql逻辑 问题描述 需要对当前日期格式如 xff1a 2023 02 23 当遇到 的时候进行换行处理 其他的文本描述字段同理 问题分析 通过查找presto的函数 xff0c 换

随机推荐

  • Qt扫盲-QMenu理论总结

    QMenu理论总结 一 概述二 常用操作1 添加Action2 信号槽3 可撕下菜单4 展示菜单 一 概述 QMenu其实就是菜单控件 xff0c 菜单控件本质上就是一个选择项目 它可以是菜单栏中的下拉菜单 xff0c 也可以是独立的上下文
  • c++: internal compiler error: Segmentation fault (program cc1plus) 解决

    在ubuntu中编译很多库 xff0c 尤其是很大的一些中间件 xff0c 常常会c 43 43 internal compiler error Segmentation fault program cc1plus 这个错误 xff0c 看
  • Windows 远程桌面连接 Jetson Nx (Linux)Ubuntu 18.04

    一 Windows打开远程桌面工具 采取Windows自带远程桌面工具 xff0c 使用win 43 r输入打开mstsc 输入目标ip xff0c 以及用户名 xff08 在显示选项中打开输入用户名 xff09 二 Linux配置 安装x
  • Android studio更换阿里源

    对特定项目生效 xff0c 在项目中的build gradle修改内容 buildscript span class token punctuation span repositories span class token punctuat
  • docker 服务与调用

    docker file ROM tensorflow1 span class token punctuation span 14 python3 span class token punctuation span 5 20210111 sp
  • CTC loss原理详解大全

    ctc本质是损失函数 xff0c 在我的学习过程中浏览了一些博客 xff0c 下面整理了一些写的较好 较详细的 xff1a 1 过程详细 xff0c 全英文 2 博主参照原文讲解的 3 有伪代码 xff0c 帮助理解 4 中文解释 xff0
  • Python 对象、类、实例的联系与区别

    Python 中的对象 类 实例 本文讲述Python 中对象 类 实例的联系与区别 来源 xff1a 笨办法学 Python xff08 Learn Python The Hard Way xff09 作者 xff1a Zed Shaw
  • linux安装tailf 命令

    1 复制如下代码到一个新建的tailf c文件里 span class token comment tailf c tail a log file and then follow it Created Tue Jan 9 15 49 21
  • DBNet学习笔记

    1 网络结构 xff1a 1 网络流程 输入一张图片 xff0c 经过卷积操作 gt 1 2 gt 1 4 gt 1 8 gt 1 16 gt 1 32进行特征的提取 xff0c 然后进行上采样操作 xff0c 上采样的过程是把1 32的特
  • ubuntu18.04 安装PCL1.8.1

    ubuntu18 04 安装PCL1 8 1 注意版本匹配 xff1a PCL1 8 1 43 VTK7 1 1 43 QT5 14 2 1 PCL github 地址 xff1a https github com PointCloudLi
  • ubuntu 18.04 docker 安装

    docker 官网 xff1a https docs docker com engine install ubuntu xff08 1 xff09 按照官网安装教程 xff1a 我选择的是Install from a package安装方法
  • C++函数返回多个值:结构体、tuple

    C 43 43 函数一般可以返回一个值 xff0c 但是在使用中常常需要一个函数返回多个值 xff0c 因此可以使用结构体或tuple来进行实现 注意看代码里的注释 xff01 xff01 xff01 1 使用结构体返回多个值 实现步骤 x
  • 【GStreamer 】1-扫盲介绍

    从历史的角度来看 xff0c Linux 在多媒体方面已经远远落后于其它的操作系统 微软的Windows和苹果的MacOS它们对多媒体设备 多媒体创作 播放和实时处理等方面已经有了很好的支持 另一方面 xff0c Linux对多媒体应用的综
  • C++判断文件是否存在

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • PCL编译完成后找不到库

    使用执行命令L g 43 43 std 61 c 43 43 14 I usr local include pcl 1 8 I usr local include eigen3 main cpp o test111 其中 std 61 c
  • docker安装及使用,常用命令总结

    1 安装 参考官方教程 xff1a https docs docker com engine install ubuntu 有三种安装方法 xff1a Install using the repository Install from a
  • CMakeLists.txt中相关指令和含义

    语法格式 xff1a 指令 xff08 参数1 参数2 xff09 参数使用括号括起来 参数之间使用空格或分号分开 指令大小写无关 xff0c 参数和变量大小写有影响 重要指令 1 cmake minimum required xff1a
  • ubuntu 18.04安装nvidia驱动后,电脑开机失败

    安装驱动后电脑开机失败 xff0c 恢复到安装驱动之前的状态 xff1a 在nvidia 官网 https www nvidia com Download index aspx 下载显卡驱动 xff0c 并安装成功后重启电脑发现电脑重启失败
  • c++ CUDA nvcc编译问题

    安装了cuda10 1 xff0c 使用cuda编译代码时 xff0c 显示 xff1a Cannot get compiler information span class token operator span Compiler exi
  • PCL库点云小知识

    1 计算极值点 include lt pcl io pcd io h gt include lt pcl point types h gt include lt pcl common common h gt pcl PointCloud l