PCL系列——拼接两个点云

2023-05-16

博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com


PCL系列

  • PCL系列——读入PCD格式文件操作
  • PCL系列——将点云数据写入PCD格式文件
  • PCL系列——拼接两个点云
  • PCL系列——从深度图像(RangeImage)中提取NARF关键点
  • PCL系列——如何可视化深度图像
  • PCL系列——如何使用迭代最近点法(ICP)配准
  • PCL系列——如何逐渐地配准一对点云
  • PCL系列——三维重构之泊松重构
  • PCL系列——三维重构之贪婪三角投影算法
  • PCL系列——三维重构之移动立方体算法

说明

通过本教程,我们将会学会:

  • 如何拼接两个不同的点云的点,约束条件是两个数据集中的域的数量和类型必须相等。* 如何拼接两个不同点云的域,约束条件是连个数据集中的点的数量必须相等。

操作

  • 在VS2010 中新建一个文件 concatenate_clouds.cpp,然后将下面的代码复制到文件中。
  • 参照之前的文章,配置项目的属性。设置包含目录和库目录和附加依赖项。
#include <iostream> //标准输入输出流
#include <pcl/io/pcd_io.h> //PCL的PCD格式文件的输入输出头文件
#include <pcl/point_types.h> //PCL对各种格式的点的支持头文件
//比如,你的程序遇到调用栈用完了的威胁。你说,你到什么地方借内存,
//存放你的错误信息?cerr的目的,就是在你最需要它的紧急情况下,
//还能得到输出功能的支持。 缓冲区的目的,就是减少刷屏的次数

// 程序拼接A和B到C
int main (int argc, char** argv)
{
  if (argc != 2) // 需要一个参数 -f 或 -p
  {
    std::cerr << "please specify command line arg '-f' or '-p'" << std::endl;
    exit(0);
  }
	// 用于拼接不同点云的点的变量
  pcl::PointCloud<pcl::PointXYZ> cloud_a, cloud_b, cloud_c; //创建点云(不是指针),存储点坐标xyz
	// 用于拼接不同点云的域(点和法向量)的变量
  pcl::PointCloud<pcl::Normal> n_cloud_b; //创建点云,储存法向量
  pcl::PointCloud<pcl::PointNormal> p_n_cloud_c; //创建点云,储存点坐标和法向量

  //填充点云数据
  cloud_a.width  = 5; //设置宽度
  cloud_a.height = cloud_b.height = n_cloud_b.height = 1; //设置高度
  cloud_a.points.resize (cloud_a.width * cloud_a.height); //变形,无序
  if (strcmp(argv[1], "-p") == 0) //根据输入参数,设置点云
  {
    cloud_b.width  = 3; //cloud_b用于拼接不同点云的点
    cloud_b.points.resize (cloud_b.width * cloud_b.height);
  }
  else{
    n_cloud_b.width = 5; //n_cloud_b用于拼接不同点云的域
    n_cloud_b.points.resize (n_cloud_b.width * n_cloud_b.height);
  }
  for (size_t i = 0; i < cloud_a.points.size (); ++i) //设置cloud_a中点的坐标(随机数)
  {
    cloud_a.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud_a.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud_a.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
  }
  if (strcmp(argv[1], "-p") == 0)
    for (size_t i = 0; i < cloud_b.points.size (); ++i) //设置cloud_b中点的坐标(随机数)
    {
      cloud_b.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
      cloud_b.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
      cloud_b.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
    }
  else // -f
    for (size_t i = 0; i < n_cloud_b.points.size (); ++i) //设置n_cloud_b中点的坐标(随机数)
    {
      n_cloud_b.points[i].normal[0] = 1024 * rand () / (RAND_MAX + 1.0f);
      n_cloud_b.points[i].normal[1] = 1024 * rand () / (RAND_MAX + 1.0f);
      n_cloud_b.points[i].normal[2] = 1024 * rand () / (RAND_MAX + 1.0f);
    }

	// 打印拼接用的数据 A和B
  std::cerr << "Cloud A: " << std::endl;
  for (size_t i = 0; i < cloud_a.points.size (); ++i) //打印cloud_a的点坐标信息
    std::cerr << "    " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl;

  std::cerr << "Cloud B: " << std::endl; //打印Cloud B
  if (strcmp(argv[1], "-p") == 0) //若输入参数是-p,打印cloud_b;
    for (size_t i = 0; i < cloud_b.points.size (); ++i)
      std::cerr << "    " << cloud_b.points[i].x << " " << cloud_b.points[i].y << " " << cloud_b.points[i].z << std::endl;
  else //若-f,打印n_cloud_b
    for (size_t i = 0; i < n_cloud_b.points.size (); ++i)
      std::cerr << "    " << n_cloud_b.points[i].normal[0] << " " << n_cloud_b.points[i].normal[1] << " " << n_cloud_b.points[i].normal[2] << std::endl;

  //复制点云中的点
  if (strcmp(argv[1], "-p") == 0)
  {
    cloud_c  = cloud_a;
    cloud_c += cloud_b; // cloud_a + cloud_b 意思是cloud_c包含了a和b中的点,c的点数 = a的点数+b的点数
    std::cerr << "Cloud C: " << std::endl; 打印Cloud C
    for (size_t i = 0; i < cloud_c.points.size (); ++i) //打印Cloud C
      std::cerr << "    " << cloud_c.points[i].x << " " << cloud_c.points[i].y << " " << cloud_c.points[i].z << " " << std::endl;
  }
  else //若输入参数是-f
  {
    pcl::concatenateFields (cloud_a, n_cloud_b, p_n_cloud_c); //拼接(点)cloud_a和(法向量)n_cloud_b到p_n_cloud_c
    std::cerr << "Cloud C: " << std::endl;
    for (size_t i = 0; i < p_n_cloud_c.points.size (); ++i) //打印Cloud C
      std::cerr << "    " <<
        p_n_cloud_c.points[i].x << " " << p_n_cloud_c.points[i].y << " " << p_n_cloud_c.points[i].z << " " <<
        p_n_cloud_c.points[i].normal[0] << " " << p_n_cloud_c.points[i].normal[1] << " " << p_n_cloud_c.points[i].normal[2] << std::endl;
  }

  return (0);
}
  • 重新生成项目。
  • 到改项目的Debug目录下,按住Shift,同时点击鼠标右键,在当前窗口打开CMD窗口。
  • 在CMD窗口中,输入命令concatenate_clouds.exe -p,执行拼接不同点云的点。结果如下图所示。
    这里写图片描述
  • 在CMD窗口中,输入命令concatenate_clouds.exe -f,执行拼接不同点云的域(比如点和法向量)。结果如下图所示。
    这里写图片描述

参考

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

PCL系列——拼接两个点云 的相关文章

  • LINUX下查看点云图————point cloud(.ply .vtk .pcd)

    首先 你要确定点云的格式 pcd vtk 还是 ply 如果是 pcd vtk 那么可以用pcl工具查看 1 安装pcl 官网链接点击打开链接 sudo add apt repository ppa v launchpad jochen s
  • 三维重建工具——pclpy使用教程

    最近试了试用pclpy这个库进行点云处理 在此对pclpy的使用进行一个总结 更全的pclpy教程 代码完全开源 github 欢迎fork star 相关文章 pclpy安装 文章目录 pclpy相关 开发环境 文件结构 I O读取 构造
  • PCL学习(1)PCL初玩

    PCL学习 文章目录 PCL学习 toc 前言 安装 说明 一步步引导做例子 关于CMakeLists txt 具体实践 官网的例子 解释 参数 总结 前言 最近进行毕设论文的设计时 博主学习计算机相关学习的过程中 但是浏览中感觉PCL进行
  • PCL系列笔记——(滤波)Filter

    目录 直通滤波 PassThrough filter 体素滤波 VoxelGrid filter 离群点滤波器 StatisticalOutlierRemoval filter 直通滤波 PassThrough filter 这个滤波很直接
  • 两幅有偏差的影像同坐标的地物不一定一样

    第一幅图上 如果经纬度100 100上是只狗 那么另外一个图上同经纬度不一定有狗了 是有偏差的
  • pcl::getTranslationAndEulerAngles精度缺失问题

    pcl getTranslationAndEulerAngles的功能是根据仿射矩阵计算x y z roll pitch yaw 但发现这种计算的rpy有一定的精度问题 于是进行了实验 一个是从一个四元数 根据eulerAngles计算rp
  • C++使用PCL注册内存以及释放

    最近测试中发现 电脑运行一定时间就会重启 检查后发现其实是内存被占满了 然后电脑就卡住 这时会有两种情况 重启 把某些程序kill掉释放内存 这个时候不一定会kill那些占很多内存的程序 然后接着查 发现其实就是处理点云的一个程序 注册了内
  • PCL中的区域生长分割(region growing segmentation)

    在本博文中 我主要介绍如何在pcl RegionGrowing类中调用区域增长算法 首先注意一点 这里是region growing segmentation 不是color based region growing segmentatio
  • 不使用PCL库,C++保存PLY文件

    输入文件名和TriangulatePoints的结果 void savePLY const std string ply3D filename cv Mat pnts time t t time 0 char tmp1 64 strftim
  • PCL1.8.0+VS2013环境配置

    一 PCL环境配置 1 下载PCL 1 8 0 AllInOne msvc2013 win32exe和PCL 1 8 0 AllInOne msvc2013 win32exe pdb然后解压 配置环境变量PATH 下载链接 https pa
  • 点云边界提取及可视化

    include
  • pcl经典算法60例——所有代码参考链接(开源)

    pcl经典算法60例大集合 方法名称 开源链接 1 打开点云 MFC显示点云 柯西等式的博客 CSDN博客 2 显示法线 PCL计算点云的法线 pcl 法线 Tom Hardy的博客 CSDN博客 3 三角化 PCL学习笔记 点云曲面重建
  • KITTI数据集之点云地图构建

    本文描述了如何通过KITTI数据集 读取激光雷达点云数据 并通过ground truth 对前后两帧点云进行旋转变换 使得二者统一坐标系 不断叠加点云进行点云建图的过程 使用的是KITTI odometry中的07号数据集 其主要内容包括
  • 点云边界提取方法总结

    目录 经纬线扫描法 网格划分法 法线估计法 alpha shapes算法 原始点云 经纬线扫描法 经纬线扫描法的基本思想是 将经过坐标变换后的二维数据点集按照 x值的大小排序后存储在一个链表中 在二维平面建立点集的最小包围盒并分别计算出 x
  • VTK读取.ply数据并获取顶点,面等信息

    Code by cynthia chen 2021 10 29 include
  • vs2022配置pcl1.13.1

    1 下载 打开GitHub网站 搜索pcl 选择第一个结果打开 按照下图步骤操作 下载PCL预编译安装程序PCL 1 13 1 AllInOne msvc2022 win64 exe 和要安装的PCL组件 例如pcl 1 13 1 pdb
  • 点云配准注意的地方

    1 法向量是局部坐标系的概念 因此要将点云中心移到原点 再计算法向量 类似于先平移再旋转 而不是先旋转再平移 2 用kdtree时 用近邻点个数 而不是距离 因为点云各个不同 3 变换矩阵的对角线是目标与源点云的相似度 位移为0 x det
  • Visual Studio 2022配置PCL1.12.1版本点云库

    说明 这个配置步骤是当时自己参考2019配置的 当时网上还没有VS2022的配置步骤 我在自己电脑上是配置成功了 所以我将配置过程记录了下来 仅供参考 1 软件下载 Microsoft Visual Studio 2022 Pro http
  • 对 pcl::StatisticalOutlierRemoval 滤波器的理解

    对 pcl StatisticalOutlierRemoval 滤波器的理解 注 以下内容基于与 GPT 4 的交流并结合个人理解整理而成 若有描述不准确或模糊之处 欢迎指正 参数配置 setMeanK int meanK 此参数设置每个点
  • 对 pcl::StatisticalOutlierRemoval 滤波器的理解

    对 pcl StatisticalOutlierRemoval 滤波器的理解 注 以下内容基于与 GPT 4 的交流并结合个人理解整理而成 若有描述不准确或模糊之处 欢迎指正 参数配置 setMeanK int meanK 此参数设置每个点

随机推荐

  • ARM64 ubuntu20.04根文件系统制作

    ARM64 ubuntu20 04根文件系统制作 虚拟机环境搭建创建镜像文件官网下载ubuntu base切换根文件系统安装工具包安装桌面环境 netplan配置添加用户卸载没用的软件ubuntu修改串口实现自动登录 关闭自动休眠 虚拟机环
  • 无法打开kernel32.lib msvcprt.lib等问题

    解决方法 xff1a 在VC的库包含目录里面 xff0c 库目录 lib 添加 xff1a LibraryPath
  • centos7.6远程图形桌面开启和VNC连接

    centos7 6远程图形桌面开启和VNC连接 xff08 一 xff09 安装 yum install tigervnc tigervnc xff1b yum install tigervnc tigervnc server y 搞什么鬼
  • Mac配置sublime text3+python3+brew+boost+cmake+kenlm环境

    1 首先安装python3 xff0c 配置python3环境 下载python3 7 1安装包 xff0c 链接 https pan baidu com s 1JaPaoUCGNeYj60gATpb9eg 密码 0mh6 将python3
  • Centos7安装Python3.7详细教程

    Centos7安装Python3 7详细教程 注 xff1a 如果安装更高的python版本 xff0c 只需修改wget 后面的地址即可 xff0c 然后注意执行命令时候的路径等问题 如 xff1a 安装python3 7 5 则 xff
  • 多用户同时修改同一条数据(并发修改数据)

    如果两个用户同时打开一条记录 xff0c 修改后提交会产生更新冲突 办法有三 xff1a 1 打开同时锁定表的记录 2 用lock对修改方法加锁 2 捕获错误 xff0c 撤消其中一个用户的修改 场景描述如下 xff1a 用户A B同时打开
  • Go 语言入门很简单:Go 实现简易Web应用

    前言 截止到目前为止 xff0c 几乎我们的 Go 入门文章都是在终端运行的 在终端运行的代码或者运用运用程序只适合自己在环境搭好的环境下使用 也就是说 xff0c 如果用户没有安装 Go 语言环境 xff0c 是根本没法运行我们所写的 G
  • 【待解决】使用su或sudo出现Segmentation fault

    一台服务器上 xff0c 使用sudo会出现Segmentation fault xff0c 见下 xff1a 使用root登录后 xff0c 使用su命令 xff0c 一样的会出现Segmentation fault 暂时还未找到答案 相
  • go换源|go更换国内源

    Windows 版本 SETX GO111MODULE on go env w GOPROXY 61 https goproxy cn direct SETX GOPROXY https goproxy cn direct Linux 版本
  • linux安装go环境并配置国内源

    linux安装go环境并配置国内源 第一步 官网下载安装包 https golang google cn go1 4 linux amd64 tar gz 第二步 解压缩 tar C usr local xzf go1 4 linux am
  • python - 获取时间戳(10位和13位)

    在python 开发web程序时 xff0c 需要调用第三方的相关接口 xff0c 在调用时 xff0c 需要对请求进行签名 需要用到unix时间戳 在python里 xff0c 在网上介绍的很多方法 xff0c 得到的时间戳是10位 而j
  • curl命令模拟post请求发送json格式数据

    以下代码可以作为测试接收请求的程序直接复制使用 xff1a from flask import Flask request app 61 Flask name 64 app route 39 service 39 methods 61 39
  • pip换源 -pip更换国内镜像源

    更换pip源到国内镜像 pip国内的一些镜像 阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pypi mirrors ustc edu cn simple 豆瓣 douban ht
  • 使用python的requests 发送multipart/form-data 请求

    发送post请求 1 r 61 requests post 34 http pythontab com postTest 34 data 61 34 key 34 34 value 34 以上得知 xff0c post请求参数是以data关
  • SHELL - shell 脚本获取本机ip并将ip复制给变量待用

    bin bash VAR 61 34 eth0 34 HOST IP 61 ifconfig VAR grep 34 inet addr 34 awk 39 print 2 39 awk F 39 print 2 39 echo HOST
  • shell - sed匹配某一行开头,替换整行内容

    sed i 39 cloud server ip ccloud server ip 61 update skyeye 360safe com 39 name txt
  • caffe安装系列——安装cuda和cudnn

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装OpenCV

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • 写递归函数的正确思维方法

    什么是递归 简单的定义 当函数直接或者间接调用自己时 xff0c 则发生了递归 说起来简单 但是理解起来复杂 因为递归并不直观 也不符合我们的思维习惯 相对于递归 我们更加容易理解迭代 因为我们日常生活中的思维方式就是一步接一步的 并且能够
  • PCL系列——拼接两个点云

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深