PCL 将点云的曲率数据保存至txt

news2024/11/24 9:35:03

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 计算点云曲率

2.1.2 将曲率保存到txt文件

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        在三维点云处理过程中,曲率是重要的几何特征之一。通过PCL库的法向量和曲率估算功能,我们可以计算出点云中每个点的曲率,并将其保存到文本文件(txt)中。本文展示如何计算点云的曲率,并将其结果保存为txt文件。

1.1原理

        点云的曲率是通过邻域内点的几何结构计算出来的。曲率计算公式为:

1.2实现步骤

  1. 加载点云数据:从PCD文件中加载点云。
  2. 计算法向量和曲率:使用 pcl::NormalEstimation 计算点云中的法向量和曲率。
  3. 保存曲率到txt文件:将每个点的曲率保存至txt文件中。

1.3应用场景

  1. 表面特征分析:通过曲率判断表面光滑度、凹凸特征。
  2. 3D建模:曲率可以用来检测物体表面细节,改善模型精度。
  3. 点云配准:在配准过程中,曲率特征有助于识别局部特征,提高配准精度。

二、代码实现

2.1关键函数

2.1.1 计算点云曲率

使用 pcl::NormalEstimation 来计算点云的法向量和曲率。

pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud);                 // 设置输入点云
ne.setSearchMethod(tree);                 // 设置搜索方法
ne.setKSearch(30);                        // 设置邻域搜索的K近邻数
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
ne.compute(*normals);                     // 计算法向量和曲率

2.1.2 将曲率保存到txt文件

std::ofstream file;
file.open("curvature_data.txt");
for (size_t i = 0; i < normals->points.size(); ++i)
{
    file << "Point " << i << ": Curvature = " << normals->points[i].curvature << std::endl;
}
file.close();

2.2完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/search/kdtree.h>
#include <fstream>

int main(int argc, char** argv)
{
    // 1. 读取点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("path_to_your_point_cloud.pcd", *cloud) == -1)
    {
        PCL_ERROR("Couldn't read the PCD file!\n");
        return (-1);
    }

    // 2. 创建Kd树进行邻域搜索
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    ne.setInputCloud(cloud);            // 设置输入点云
    ne.setSearchMethod(tree);           // 设置Kd树搜索
    ne.setKSearch(30);                  // 设置K近邻数

    // 3. 计算法向量和曲率
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    ne.compute(*normals);               // 计算法向量和曲率

    // 4. 将曲率数据保存到txt文件
    std::ofstream file;
    file.open("curvature_data.txt");
    for (size_t i = 0; i < normals->points.size(); ++i)
    {
        file << "Point " << i << ": Curvature = " << normals->points[i].curvature << std::endl;
    }
    file.close();

    std::cout << "Curvature data saved to curvature_data.txt" << std::endl;

    return 0;
}

三、实现效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文速看】DL最新进展20241008-多模态、医学图像分割、扩散模型

目录 【多模态】【医学图像分割】【扩散模型】 【多模态】 PaliGemma: A versatile 3B VLM for transfer 研究机构&#xff1a;google 论文链接&#xff1a;https://arxiv.org/pdf/2407.07726 模型及其说明链接&#xff1a;https://huggingface.co/google/paligemma-3b-pt-22…

leetcode68:文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c;尽可能多地往每行中放置单词。必要时可…

RWKV-7 预览版、大量新论文...RWKV 社区 9 月动态速览

欢迎大家收看《RWKV 社区最新动态》第五期&#xff0c;本期内容收录了 RWKV 社区 2024 年 9 月的最新动态。 9 月动态省流版&#xff08;TL;DR&#xff09; RWKV 官方新闻动态 RWKV-7 发布预览版RWKV-7 论文撰写已面向社区开放RWKV 官网上线 Bad Case 收集页面RWKV 中文文档已…

攻防世界---->sherlock

做题笔记。 下载。 单词中出现大写很可疑。因为大写最多出现在开头等。 猜测是隐写术。 进行筛选。 借助python实现 with open(C:\\Users\\Acer\\Downloads\\f590c0f99c014b01a5ab8b611b46c57c.txt, r) as file:text file.read() uppercase_letters [char for char in text…

手撕数据结构 —— 顺序表(C语言讲解)

目录 1.顺序表简介 什么是顺序表 顺序表的分类 2.顺序表的实现 SeqList.h中接口总览 具体实现 顺序表的定义 顺序表的初始化 顺序表的销毁 打印顺序表 ​编辑 检查顺序表的容量 尾插 尾删 ​编辑 头插 头删 查找 在pos位置插入元素 删除pos位置的值 ​…

内核驱动-如何编译内核以及给内核中添加新文件

1.编译内核 想要编译内核&#xff0c;首先需要先下载内核源代码。可以在官方网站下载源代码压缩包&#xff0c;然后放在Ubuntu的目录下&#xff0c;然后解压&#xff08;解压的指令为&#xff1a;sudo tar -xvf xxxx.gz&#xff09;。解压之后在当前目录下可以看到解压之后的文…

java8 双冒号(::)使用方法

双冒号&#xff08;::&#xff09;运算符是跟函数式接口相关的运算符&#xff0c;作为函数式接口的赋值操作。 双冒号用于静态方法 使用方法&#xff1a;将类的静态方法赋值给一个函数式接口&#xff0c;静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就…

数字化转型:别让技术迷了眼,战略觉醒才是关键。新媒体营销大客户销售AIGC大模型创新思维专家培训讲师谈数字化转型商业模式短视频内容社私域数字经济人工智能

​数字化转型从根本上讲不是关于技术,而是关于战略。 数字化转型使用新的数字技术来实现重大的业务改进,如增强客户体验、精简运营或创建新的商业模式。数字化转型描述了一家公司试图为数字时代做好准备的旅程。 数字化转型不是关于技术或获取新的技术技能。事实上,它是关于获得…

永磁同步电机环路反步法(backstepping)控制

文章目录 1、反步控制原理1.1 李雅普诺夫稳定性定理1.2 严格反馈系统1.3 一般设计流程 2、永磁同步电机反步控制2.1 反步控制器设计2.2 反步控制仿真 参考 写在前面&#xff1a;本人能力、时间、技术有限&#xff0c;没有对一些细节进行深入研究和分析&#xff0c;也难免有不足…

简易CPU设计入门:取指令(四)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…

SOMEIP_ETS_174: SD_Unknown_Option_type

测试目的&#xff1a; 验证DUT能够拒绝一个引用了未知选项类型的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个引用了未知选项类型的SubscribeEventgroup消息时&#xff0…

Solidedge二次开发(C#)-将dft文件转换为dwg格式文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在Solid Edge中创建一个par文件3、通过二次开发将dft转换为dwg4、结果显示1、前言 Solid Edge提供了将dft转换为dwg的接口,也即是保存功能。有时在不显示Solid Edge界面的情况下,将其…

【C语言刷力扣】1436.旅行终点站

题目&#xff1a; 解题思路&#xff1a; 两层循环查找&#xff0c;第一次循环中初始化 destination 为 path中每次旅行的终点作为最终的终点。二次循环查找当前 destination &#xff0c;若是作为某次旅行的起点&#xff0c;说明不是最后的终点。 char* destCity(char ***paths…

[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制

目录 一. 认识TCP协议的报头 1.TCP头部格式 2. TCP协议的特点 二. TCP如何封装与分用 TCP 报文封装与解包 如何封装解包&#xff0c;如何分用 分离有效载荷 隐含问题&#xff1a;TCP 与 UDP 报头的区别 封装和解包的逆向过程 如何分用 TCP 报文 如何通过端口号找到绑…

多功能快捷回复软件

各位亲爱的客服宝宝们&#xff0c;每天面对大量的客户咨询&#xff0c;您是否还在手动一个一个地打字回复呢&#xff1f;别担心&#xff0c;我们为您带来了一款多功能快捷回复软件——客服宝。有了它&#xff0c;您的工作将变得无比轻松&#xff01; 客服宝是一款集成了内容存储…

网络编程(14)——基于单例模板实现的逻辑层

十四、day14 今天学习如何通过单例模板实现逻辑层 1. 利用C11特性封装单例模板 和上一节设计的单例模板有些不同&#xff0c;本节设计的单例模板利用了以下四个C11新特性&#xff0c;优化了代码 unique_lock和lock_guard once_flag和call_once std::function condition_v…

1打家劫舍三部曲

刷题刷题找工作&#xff01; s198.打家劫舍 动态规划&#xff1a;开始打家劫舍&#xff01; dp数组表示到第i家的最高金额 dp递归公式&#xff0c;要么抢劫这家&#xff0c;加上i-2所抢的钱&#xff0c;要么不抢&#xff0c;保留上一家的。 …

linux中的火墙优化策略

1.火墙介绍 1. netfilter 2. iptables 3. iptables | firewalld 2.火墙管理工具切换 在rocky9 中默认使用的是 firewalld firewalld -----> iptables dnf install iptables - services - y systemctl stop firewalld systemctl disable firewalld systemctl mask fi…

Vue3 使用 pinia

什么是Pinia Pinia是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态&#xff0c;与vuex功能一样。 准备 安装 npm install pinia 或者 yarn add pinia使用 首先修改main.ts文件 main.ts import ./assets/main.cssimport { createApp } from vue import App from…

HTB:Tactics[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which Nmap switch can we use to enumerate machines when our ping ICMP packets are blocked by the Windows firewall? 2.What does the 3-letter acronym SMB stand for? 3.What port does SMB use to operate at? 4.What comma…