点云学习笔记15——PCL基础

  • 命名规范
  • 常用代码
    • 1、时间计算
    • 2、pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换
    • 3、如何查找点云的x,y,z的极值?
    • 4、知道需要保存点的索引,从原点云中拷贝点到新点云
    • 5、如何从点云里删除和添加点
    • 6、 链接两个点云字段(两点云大小必须相同)
    • 7、如何从点云中删除无效点
    • 8、计算质心
    • 9、从网格提取顶点(将网格转化为点)
    • 10、获取点云点数
  • 资料汇总

主要参考《点云库PCL学习教程—朱德海》以及github上发现了一个人总结的书中的笔记

命名规范

源文件.cpp 结尾

命名空间命名:命名空间多余一个单词的应该用下划线连接

namespace pcl_io
{...
}

常用代码

1、时间计算

pcl中计算程序运行时间有很多函数,其中利用控制台的时间计算是:

#include <pcl/console/time.h>pcl::console::TicToc time; time.tic(); //+程序段 + cout<<time.toc()/1000<<"s"<<endl;

就可以以秒输出“程序段”的运行时间。

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 cloudPointer(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud = *cloudPointer;
cloudPointer = cloud.makeShared();

3、如何查找点云的x,y,z的极值?

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ> ("your_pcd_file.pcd", *cloud);
pcl::PointXYZ minPt, maxPt;
pcl::getMinMax3D (*cloud, minPt, maxPt);

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>("C:\office3-after21111.pcd", *cloud);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZ>);
std::vector<int > indexs = { 1, 2, 5 };
pcl::copyPointCloud(*cloud, indexs, *cloudOut);

5、如何从点云里删除和添加点

#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>("C:\office3-after21111.pcd", *cloud);
pcl::PointCloud<pcl::PointXYZ>::iterator index = cloud->begin();cloud->erase(index);//删除第一个index = cloud->begin() + 5;
cloud->erase(cloud->begin());//删除第5个pcl::PointXYZ point = { 1, 1, 1 };
//在索引号为5的位置1上插入一点,原来的点后移一位
cloud->insert(cloud->begin() + 5, point);cloud->push_back(point);//从点云最后面插入一点std::cout << cloud->points[5].x;//输出1

6、 链接两个点云字段(两点云大小必须相同)

#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("/home/yxg/pcl/pcd/mid.pcd",*cloud);
pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal> ne;
ne.setInputCloud(cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>());
ne.setKSearch(8);//ne.setRadisuSearch(0.3);
ne.compute(*cloud_normals);
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_nomal (new pcl::PointCloud<pcl::PointNormal>);
pcl::concatenateFields(*cloud,*cloud_normals,*cloud_with_nomal);

7、如何从点云中删除无效点

pcl中的无效点是指:点的某一坐标值为nan.

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/filter.h>
#include <pcl/io/pcd_io.h>using namespace std;
typedef pcl::PointXYZRGBA point;
typedef pcl::PointCloud<point> CloudType;int main (int argc,char **argv)
{CloudType::Ptr cloud (new CloudType);CloudType::Ptr output (new CloudType);pcl::io::loadPCDFile(argv[1],*cloud);cout<<"size is:"<<cloud->size()<<endl;vector<int> indices;pcl::removeNaNFromPointCloud(*cloud,*output,indices);cout<<"output size:"<<output->size()<<endl;pcl::io::savePCDFile("out.pcd",*output);return 0;
}

8、计算质心

Eigen::Vector4f centroid;  //质心
pcl::compute3DCentroid(*cloud_smoothed,centroid); //估计质心的坐标

9、从网格提取顶点(将网格转化为点)

#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>//loadPolygonFileOBJ所属头文件;
#include <pcl/io/vtk_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>using namespace pcl;
int main(int argc,char **argv)
{pcl::PolygonMesh mesh;//   pcl::io::loadPolygonFileOBJ(argv[1], mesh);pcl::io::loadPLYFile(argv[1],mesh);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new     pcl::PointCloud<pcl::PointXYZ>);pcl::fromPCLPointCloud2(mesh.cloud, *cloud);pcl::io::savePCDFileASCII("result.pcd", *cloud);return 0;
}

以上代码可以从.obj或.ply面片格式转化为点云类型。

10、获取点云点数

// 输出点云大小 cloud->width * cloud->height
std::cout << "点云大小:" << cloud->size() << std::endl;

资料汇总

1、https://zhuanlan.zhihu.com/p/268524083
2、github上发现了一个人总结的书中的笔记

点云学习笔记15——PCL常用的基础代码相关推荐

  1. Spring.NET学习笔记15——AOP的配置(基础篇) Level 200

    上篇我学习了Spring.NET的四种通知类型,AOP的实现方案比较复杂,是通过代码实现的.而Spring.NET框架给我们提供了配置的方式来实现AOP的功能.到目前为止,我们已经讨论过使用Proxy ...

  2. 点云学习笔记7——python pcl将点云数据转换成俯视图(鸟瞰图)

    点云学习笔记7--python pcl将点云数据转换成俯视图(鸟瞰图) 环境安装 点云数据 代码 效果图 参考 环境安装 可以参考我另外一篇文章: 点云学习笔记3--点云库(PCL)安装与测试教程 点 ...

  3. amazeui学习笔记--css(常用组件5)--评论列表Comment

    amazeui学习笔记--css(常用组件5)--评论列表Comment 一.总结 1.am-comment:使用am-comment来声明评论对象,这个是放在article里面的,虽然article ...

  4. amazeui学习笔记--css(常用组件6)--图标Icon

    amazeui学习笔记--css(常用组件6)--图标Icon 一.总结 1.关注用法即可:在 HTML 上添加添加 am-icon-{图标名称} class. <span class=&quo ...

  5. Linux学习笔记:Linux常用命令总结

    文章目录 前言 Linux学习笔记:Linux常用命令总结 1. 目录命令 1.1 Linux目录结构 1.2 cd命令 切换工作目录 1.3 ls命令 显示目录下文件 1.4 mkdir命令 创建目 ...

  6. amazeui学习笔记--css(常用组件4)--关闭按钮Close

    amazeui学习笔记--css(常用组件4)--关闭按钮Close 一.总结 1.关闭按钮基本用法:关闭按钮样式,可以结合其他不同组件使用.对 <a> 或者 <button> ...

  7. 【学习笔记】一些常用的数学公式

    [学习笔记]一些常用的数学公式 手动博客搬家: 本文发表于20181224 11:28:00, 原地址https://blog.csdn.net/suncongbo/article/details/8 ...

  8. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  9. amazeui学习笔记--css(常用组件1)--小徽章Badge

    amazeui学习笔记--css(常用组件1)--小徽章Badge 一.总结 1.am-badge:添加am-badge来声明小徽章对象 <span class="am-badge a ...

最新文章

  1. android Tabhost部件
  2. redhat nginx php mysql_redhat7+nginx+mysql+php
  3. jzoj1350-游戏(某C组)【SPFA,图,最短路】
  4. Java BigDecimal Rounding Mode
  5. PHP+SQLite3简约网址导航、书签管理器网站源码
  6. 算法时间复杂度分析专题一(帮助快速解题)
  7. The content of element type “resultMap“ must match “(constructor?,id*,result*,association*,collectio
  8. MySQL 临时表的原理以及优化手段
  9. 计算机基础——4.1 数字通信入门
  10. 3097: Hash Killer I
  11. 技术解读:Dragonfly 基于 P2P 的智能镜像加速系统 | 龙蜥技术
  12. Nginx搭建虚拟域名
  13. 化工厂在岗人员定位系统-化工厂人员定位-化工厂定位-新导智能
  14. 虞美人盛开的山坡片尾曲_さよならの夏_离别的夏天_歌词_带假名及翻译
  15. 前端案例-30 Vue常用特性案例汇总
  16. Python网络爬虫简单教程——第一部
  17. 安卓9去掉搜索栏_小米9pro桌面下边搜索栏怎么关闭 只需一招即可搞定
  18. 2020.8.5课堂笔记(多线程)
  19. java计算机毕业设计租房管理系统源程序+mysql+系统+lw文档+远程调试
  20. 机器学习笔记 - 用于颜值评分的数据集和算法

热门文章

  1. 8. PyQt5信号(signals)和槽(slots)
  2. CSM和PMI-ACP认证有什么区别
  3. 基于C++的考试系统
  4. NS3教程(下载、安装、测试)
  5. 投稿IEEE或Elsevier的文章上传arxiv
  6. CITA v0.18 新增「基于 Rust 语言的国密算法库」新特性
  7. 洛谷 P2958 [USACO09OCT]木瓜的丛林Papaya Jungle
  8. 思迈特软件Smartbi:稳健发展的证券公司如何打造“智慧风控”体系
  9. 查看linux系统常用的命令,Linux查看系统配置常用命令
  10. elastalert