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系列——拼接两个点云 的相关文章

  • 解决PCL报错: Assertion `point_representation_->isValid (point) && “Invalid (NaN, Inf) point coordinates

    参考资料 https github com PointCloudLibrary pcl blob master kdtree include pcl kdtree impl kdtree flann hpphttps blog csdn n
  • PCL---RANSAC随机采样一致性算法

    前言 通过前面的文章 xff0c 我们基本上代建的相关环境 本文将继续基于此继续学习PCL相关采样一致性算法 基础代码下载 1 准备 1 1 Ransac算法介绍 RANSAC从样本中随机抽选出一个样本子集 xff0c 使用最小方差估计算法
  • LINUX下查看点云图————point cloud(.ply .vtk .pcd)

    首先 你要确定点云的格式 pcd vtk 还是 ply 如果是 pcd vtk 那么可以用pcl工具查看 1 安装pcl 官网链接点击打开链接 sudo add apt repository ppa v launchpad jochen s
  • PCL点云库学习笔记(搜索方法)

    PCL点云库学习笔记 搜索方法 一 k d tree 二 八叉树 一 k d tree 我们所有的k d树都是三维空间的 k d树的每个级都使用特定维度拆分所有子级 在树的根部 所有子项都将根据第一维进行拆分 即 如果第一维坐标小于根 则它
  • PCL1.12+VTK9.1+QT6编译部署

    本文讲解使用的环境是vs2019 pcl1 12 0 vtk9 1 qt6 0 最后再展示一个示例程序 1 编译VTK vtk下载地址如下 https vtk org download 然后用cmake构建 修改一下几个地方 然后打开生成的
  • [pcl::VoxelGrid::applyFilter] Leaf size is too small for the input dataset 报错解决,亲测可行

    pcl VoxelGrid applyFilter Leaf size is too small for the input dataset 报错解决 亲测可行 1 报错日志 Python pcl 点云下采样时报错如下 pcl VoxelG
  • 第七周PCL学习--点云配准(七)

    目录 引言 一 点云配准 1 1 定义 1 2 含义 1 3 配准过程 1 4 算法原理 1 5 实验 二 总结 三 参考 引言 随着计算机辅助设计技术的发展 通过实物模型产生数字模型的逆向工程技术 由于它的独特魅力获得了越来越广泛的应用
  • 【点云下采样/抽稀】python-pcl:pcl::VoxelGrid::applyFilter

    这篇博客将介绍如何使用python pcl对点云las laz进行下采样 抽稀 可以根据设置的参数决定下采样到元数据的90 80 60 或者40 不会完整的按这个梯度递减 但参数rate顺序下降 基本能大致达到这个概率 下采样设置的voxe
  • C++使用PCL注册内存以及释放

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

    转载 有梦想的田园犬 https blog csdn net AmbitiousRuralDog article details 80267519
  • 关于CMake生成包含PCL库和CGAL库的工程时出现“无法解析的外部符号”的错误

    前言 博主之前安装了PCL 1 8 0库 教程链接 PCL 1 8 0 AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法 和CGAL库 教程链接 在Win8 VS2013中配置CGAL库 最近需要把两个库用在同一
  • 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点云库学习笔记(可视化2)

    PCL点云库学习笔记 可视化 可视化 四 PCLPlotter 五 MFC 开发实例 可视化 四 PCLPlotter 4 1 绘制多项式 PCLPlotter提供了一个非常简单明了的图形绘制界面 可以在库中可视化各种重要的图 从多项式函数
  • PCL点云库的架构

    1 输入 输出 PCL中所有的处理都是基于点云展开的 利用不同的设备获取点云 存储点云等都是点云处理前后必须做的流程 PCL中有自己设计的内部PCD文件格式 为此 设计读写该格式以及与其他3D文件格式之间进行转化的接口类都是很必要的 目前P
  • PCL之区域生长分割

    算法思想 首先依据点的曲率值对点进行排序 之所以排序 是因为区域生长算法是从曲率最小的点开始生长的 这个点就是初始种子点 初始种子点所在的区域即为最平滑的区域 从最平滑的区域开始生长可减少分割片段的总数 提高效率 算法流程 设置一空的种子点
  • vs调试问题:error LNK1112编译器位数配置问题

    编译环境为 pcl1 8 vs2013 代码实现点云数据的相关处理 在编译的时候出现如下错误 error LNK1112 module machine type X86 conflicts with target machine type
  • 点云配准注意的地方

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

    说明 这个配置步骤是当时自己参考2019配置的 当时网上还没有VS2022的配置步骤 我在自己电脑上是配置成功了 所以我将配置过程记录了下来 仅供参考 1 软件下载 Microsoft Visual Studio 2022 Pro http
  • 3D点云处理:Opencv Pcl实现深度图转点云(附源码)

    文章目录 0 测试效果 1 代码实现 文章目录 3D视觉个人学习目录 0 测试效果 处理结果 1 代码实现 文章中提供的深度图像 深度图像一般以 tiff和 png保存 可以通过Opencv中的 c v i m r

随机推荐

  • 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系列 从深