PCL生成线段点云

2023-10-27

  • 生成三角形
  • 生成平行四边形
  • 生成凸包

pcl 生成线段点云

pcl官方有生成球体、圆柱体、圆锥体的相关函数,似乎没有生成线段的函数,正好有需要,所以自己写了两个,分别是根据数量和步长生成。

原理

原理很简单,已知两个三维点p1,p2,求出方向向量和向量p1p2的模,再根据设置的点的数量和步长添加进点云。

// 根据数量
void creatseg(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int num) {
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    if (num<1){
        print_highlight("点的数量应为大于0的整数");
    }
    else {
        double delt = k.norm() / num;
        k = k / k.norm();
        cloud->points.resize(num);
        for (auto i = 0; i < num; ++i) {
            cloud->points[i].x = p2.x + delt * i * k[0];
            cloud->points[i].y = p2.y + delt * i * k[1];
            cloud->points[i].z = p2.z + delt * i * k[2];
        }
        cloud->push_back(p1);
        cloud->push_back(p2);
    }
}
// 根据步长
void creatsegment(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ> ::Ptr cloud, double delt) {
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    int num = k.norm() / delt;
    k = k / k.norm();
    cloud->points.resize(num);
    for (auto i = 0; i < num; ++i) {
        cloud->points[i].x = p2.x + delt * i * k[0];
        cloud->points[i].y = p2.y + delt * i * k[1];
        cloud->points[i].z = p2.z + delt * i * k[2];
    }
    cloud->push_back(p1);
    cloud->push_back(p2);

}

测试代码如下

#include <pcl/PCLPointCloud2.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/uniform_sampling.h>
#include <pcl/console/print.h>
#include <pcl/console/parse.h>
#include <pcl/console/time.h>

using namespace std;
using namespace pcl;
using namespace pcl::io;
using namespace pcl::console;

void creatseg(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int num) {
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    if (num<1){
        print_highlight("点的数量应为大于0的整数");
    }
    else {
        double delt = k.norm() / num;
        k = k / k.norm();
        cloud->points.resize(num);
        for (auto i = 0; i < num; ++i) {
            cloud->points[i].x = p2.x + delt * i * k[0];
            cloud->points[i].y = p2.y + delt * i * k[1];
            cloud->points[i].z = p2.z + delt * i * k[2];
        }
        cloud->push_back(p1);
        cloud->push_back(p2);
    }
}

void creatsegment(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ> ::Ptr cloud, double delt) {
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    int num = k.norm() / delt;
    k = k / k.norm();
    cloud->points.resize(num);
    for (auto i = 0; i < num; ++i) {
        cloud->points[i].x = p2.x + delt * i * k[0];
        cloud->points[i].y = p2.y + delt * i * k[1];
        cloud->points[i].z = p2.z + delt * i * k[2];
    }
    cloud->push_back(p1);
    cloud->push_back(p2);

}

int main() {
    pcl::PointXYZ P1(12, 2.3, 7.89), P2(0, 0, 0);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    creatseg(P1, P2, cloud, 10000);
    pcl::io::savePCDFile("line.pcd",*cloud);
    creatsegment(P1, P2, cloud, 0.0001);
    pcl::io::savePCDFile("segment.pcd", *cloud);
}

生成的线段如下图。

在这里插入图片描述

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

PCL生成线段点云 的相关文章

  • 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接 [重复]

    这个问题在这里已经有答案了 可能的重复 使用扩展方法表示的嵌套 from LINQ 查询 https stackoverflow com questions 9115675 nested from linq query expressed
  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30
  • 如何在线程创建和退出时调用函数?

    include
  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • C++:将模板参数的模板类型成员添加为好友的正确语法?

    我有一个带有模板类型参数 tTRAIT 的类 我想加一个模板为好友type member aliastTRAIT 但我无法弄清楚语法 这可能吗 template
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • 求一个数的因数。无法得到准确的结果

    有人可以帮助纠正我的算法吗 我已经对几个数字进行了测试 但它没有输出完整的因式分解 对于具有大量因子的数字 它完全失败 int num 20 for int i 2 i lt num i if num i 0 cout lt lt i lt
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • 按值返回的函数的返回语句中的初始化

    我的问题源于深入研究std move in return语句 例如以下示例 struct A A std cout lt lt Constructed lt lt this lt lt std endl A A noexcept std c
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • EWS - 给予预约,获取预约的所有者副本

    在 EWS 中进行预约后 是否可以获得所有者的副本 例如 如果我登录为user1 我有user1创建的约会的副本user2 我有冒充权 我要编辑user2预约的副本 我怎样才能获得user2 s copy 您可以使用 PidLidClean
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 如何使用 xamarin 表单提示用户进行地理定位

    我正在 Xamarin Forms 应用程序中开发一个应用程序 需要请求地理位置权限 如果获得许可 它需要从设备获取地理位置数据 然后将地理位置坐标放入 Forecast io URL 我正在使用 James 的 Geolocator 插件
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list

随机推荐

  • 最新Anaconda保姆级安装教程:手把手带你走进数据分析Anaconda安装门槛

    Python数据分析入门 基础概念和最新Anaconda安装 综述 什么是数据分析 数据分析是用适当的方法对收集来的大量数据进行分析 帮助人们作出判断 以便采取适当行动 mermaid svg lsc3TUoKjNk4ccj7 font f
  • 【Linux】—— vim常用操作命令

    这里写目录标题 1 vim的基本概念 2 命令模式的操作 光标跳转 剪贴复制 撤销修改 3 底行模式操作 4 配置vim编辑器 使用文件配置 快速配置 1 vim的基本概念 概念 vim重点解决代码编写的问题 本质文本编辑器 是具有多模式的
  • 简单搭建frp服务(服务端与客户端)

    记录搭建frp服务的过程 首先下载frp 本人使用的是0 22 0版本 其它版本可能不适用 可以通过wget命令进行下载 wget https github com fatedier frp releases download v0 22
  • ElacsticSearch中集合了分组、排序,求和,group by sort sum sum(A*B)

    最近做了一个项目 以前是mysql中 现在使用es进行查询 mysql的查询是 返回的结果是 1 字段求和的数据 2 字段相乘再求和在除数据 这个问题卡了一天 3 根据某个字段分组 4 根据某个字段排序 根据思路因为是求和 所以需要用到聚合
  • 消息 ByteBuf 详解

    Netty提供了ByteBuf来替代Java NIO的ByteBuffer缓冲区 以操纵内存缓冲区 与Java NIO的ByteBuffer相比 ByteBuf的优势如下 Pooling 池化 这点减少了内存复制和GC 提升了效率 复合缓冲
  • SpringBoot简介

    SpringBoot 第一部分 SpringBoot应用 相关概念 约定优于配置 约定优于配置 Convention over Configuration 又称按约定编程 是一种软件设计规范 本质上是对系统 类库或框架中一些东西假定一个大众
  • 微信小程序:以7天为周期,连续签到7天功能效果

    此功能以1 2 3 4 5 6 7这样为一周期 连续签到的功能 通过计算是否为整除7天计算 每7天后切换数目 从而改变周期表 本案例只是提供案例的基本操作 进一步涉及 每日用户集的监听 日历表 签到统计 连续签到 签到中断 后端数据处理 等
  • intellij idea 双击选中一个变量而不是单词

    在keymap 里搜索 select Word at caret 然后双击并在弹出选项里选add mouse shortcut 然后选double click 再在下面click pad 区域点一下 就可以和eclipse一样双击选中完整的
  • 查看权限linux文件权限

    查看权限 rw rw r 一共有10位数 其中 最前面那个 代表的是类型 中间那三个 rw 代表的是所有者 user 然后那三个 rw 代表的是组群 group 最后那三个 r 代表的是其他人 other 然后我再解释一下后面那9位数 r
  • 全国大学生软件测试大赛 Web性能测试--实例(一)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 Web性能测试 实例 一 咪咕音乐测试 一 测试范围 二 测试要求 step1 a 操作流程 i 进入到咪咕音乐页面 点击 歌手 ii 对歌手进行筛选操作 点击红框内的任意按
  • 学习笔记:基于Transformer的时间序列预测模型

    1 一些准备的说明 为了便于读者理解 笔者将采取一个盾构机掘进参数预测的实际项目进行Transformer模型的说明 此外 该贴更多用于本人的学习记录 适合于对Transformer模型已经有一定了解的读者 此此次外 不定期更新中 一些参考
  • mybatisPlus分页查询的配置类

    SpringBoot中分页查询的配置类 Configuration public class MybatisPlusConfig Bean public MybatisPlusInterceptor mybatisPlusIntercept
  • 计算机视觉服务系统

    tornado教程HTTP教程 Eureka教程Eureka1Eureka2
  • Colossal-AI的安装

    最近在学习stable diffusion model 但是这个模型成本比较高 作为低端学习者 借助colossal ai加速训练 即能满足显卡要求又能节约时间 Colossal AI 是一个集成的大规模深度学习系统 具有高效的并行化技术
  • 二叉树变成搜索二叉树

    给你一个普通的二叉树 把它变成搜索二叉树 要求不改变这个树的结构 例如 给你如下二叉树 10 2 7 8 4 结果是 8 4 10 2 7 思路 1 中序遍历该二叉树 把结果存在临时数组 arr 中 2 对 arr 进行排序 3 把 arr
  • C++(11):true_type, false_type

    true type和false type是integral constant实例化的别名 C 11 integral constant 风静如云的博客 CSDN博客 template
  • matlab机械手ikine函数,matlab机器人工具箱10.1(有函数说明)

    实例简介 机器人工具箱10 1版 有例子可以学习 希望对大家有所帮助 实例截图 核心代码 robot工具箱 V10 1有例子 robot工具箱10 1及例子 matlab robot V10 1工具箱 pdf rvctools common
  • OpenXml操作Word的一些操作总结.无word组件生成word.

    OpenXml相对于用MS提供的COM组件来生成WORD 有如下优势 1 相对于MS 的COM组件 因为版本带来的不兼容问题 及各种会生成WORD半途会崩溃的问题 2 对比填满一张30多页的WORD来说 包含图 表等 用COM组件来生成会占
  • 【笔记】AOE网与关键路径

    AOE网 关键路径 求关键路径的算法实现 AOE网是以边表示活动的有向无环网 在AOE网中 具有最大路径长度的路径称为关键路径 关键路径表示完成工程的最短工期 1 AOE网 AOE网是一个带权的有向无环图 其中用顶点表示事件 弧表示活动 权
  • PCL生成线段点云

    生成三角形 生成平行四边形 生成凸包 pcl 生成线段点云 pcl官方有生成球体 圆柱体 圆锥体的相关函数 似乎没有生成线段的函数 正好有需要 所以自己写了两个 分别是根据数量和步长生成 原理 原理很简单 已知两个三维点p1 p2 求出方向