C++ PCL求解法向量及可视化

news2024/9/29 17:29:26

  【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。   

参考书籍:《人工智能点云处理及深度学习算法》

 本文为专栏《Python三维点云实战宝典》系列文章,专栏介绍地址“【python三维深度学习】python三维点云从基础到深度学习_python3d点云从基础到深度学习-CSDN博客”。配套书籍《人工智能点云处理及深度学习算法》提供更加全面和系统的解析。

        当使用 C++ 和 PCL(Point Cloud Library)来求解点云法向量并可视化时,可以按照以下步骤进行。

1. 加载点云数据

        在编写 C++ 代码时,您需要使用 PCL 提供的数据结构来加载点云数据。通常,您可以通过 PCD 文件来存储点云数据,并使用 PCL 中的函数来加载这些数据。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("path/to/your/pointcloud.pcd", *cloud);

2. 求解点云法向量

        使用 PCL 中的法向量估计方法,可以对加载的点云数据进行法向量计算。PCL 提供了多种方法来进行法向量估计,比如基于最邻近搜索的方法或者基于曲率的方法。

#include <pcl/features/normal_3d.h>

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.setRadiusSearch(0.03); // 设置搜索半径
// ne.setKSearch(5); //设置搜素点数
ne.compute(*cloud_normals);

3. 可视化法向量

        一旦计算出点云的法向量,您可以使用 PCL 的可视化模块进行可视化。PCL 提供了可视化工具,可以将点云和法向量一起显示出来。

// 可视化点云和法向量
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Point Cloud Viewer"));
viewer->setBackgroundColor(0, 0, 0);
viewer->addPointCloud<pcl::PointXYZ>(cloud, "point_cloud");

// 设置法向量可视化参数
viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, cloud_normals, 10, 0.8, "normals"); // 第4个参数是每个法向量的间隔,第5个参数是法向量的长度比例因子
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 3, "normals");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "normals"); // 设置法向量颜色为红色

      在 addPointCloudNormals 方法中,第五个参数是法向量的长度比例因子。您可以调整这个值来增加或减少法向量箭头的长度。在这个示例中,我们将其设置为 0.8,这意味着法向量的长度将与其实际大小成比例,但是缩小了 0.8 倍以便更好地在可视化中展示。您可以根据需要调整这个值来获得适合您数据的法向量长度。  

4. 完整示例程序

        示例点云rabbit.pcd下载地址为https://download.csdn.net/download/suiyingy/85129456。

/*
更多python与C++技巧、三维算法、深度学习算法总结、大模型请关注我的博客,欢迎讨论与交流:https://blog.csdn.net/suiyingy,或”乐乐感知学堂“公众号。Python三维领域专业书籍推荐:《人工智能点云处理及深度学习算法》。
*/
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>

int main()
{
    // 加载点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile("../../rabbit.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.setRadiusSearch(0.2); // 设置搜索半径
    ne.compute(*cloud_normals);

    // 输出前10个法向量
    std::cout << "前10个法向量:" << std::endl;
    for (int i = 0; i < 10; ++i) {
        std::cout << "点 " << i << " 的法向量:"
                  << cloud_normals->points[i].normal_x << ", "
                  << cloud_normals->points[i].normal_y << ", "
                  << cloud_normals->points[i].normal_z << std::endl;
    }

    // 可视化点云和法向量
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Point Cloud Viewer"));
    viewer->setBackgroundColor(0, 0, 0);
    viewer->addPointCloud<pcl::PointXYZ>(cloud, "point_cloud");

    // 设置法向量可视化参数
    viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, cloud_normals, 10, 0.8, "normals");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 3, "normals");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "normals"); // 设置法向量颜色为红色

    // 添加法向量箭头
    for (size_t i = 0; i < 10; ++i) {
        pcl::PointXYZ point(cloud->points[i].x, cloud->points[i].y, cloud->points[i].z);
        pcl::PointXYZ normal(cloud->points[i].x + cloud_normals->points[i].normal_x * 0.1,
                             cloud->points[i].y + cloud_normals->points[i].normal_y * 0.1,
                             cloud->points[i].z + cloud_normals->points[i].normal_z * 0.1);
        std::string line_id = "normal_" + std::to_string(i);
        viewer->addArrow(normal, point, 1.0, 0, 0, false, line_id);
    }

    viewer->spin();

    return 0;
}

5. 示例结果

6. 总结

        通过上述步骤,您可以使用 C++ 和 PCL 对点云数据进行法向量估计,并将结果可视化出来。当然,在实际的应用中可能涉及到更多的细节和调优,但这个简要的指南可以帮助您入门点云处理和法向量计算的基本流程。

        希望这篇文章对您有所帮助,若有任何问题欢迎交流讨论。

 【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。  

更多python与C++技巧、计算机视觉基础到实践完整指南、三维算法、深度学习算法总结、大模型请关注我的博客,欢迎讨论与交流:https://blog.csdn.net/suiyingy,或”乐乐感知学堂“公众号。Python三维领域专业书籍推荐:《人工智能点云处理及深度学习算法》。

本文为专栏《Python三维点云实战宝典》系列文章,专栏介绍地址“【python三维深度学习】python三维点云从基础到深度学习_python3d点云从基础到深度学习-CSDN博客”。配套书籍《人工智能点云处理及深度学习算法》提供更加全面和系统的解析。

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

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

相关文章

C语言sprintf函数使用

1 其函数原型为&#xff1a;int sprintf(char *str, const char *format,...)。 具体用法如下&#xff1a; 基本语法&#xff1a; str&#xff1a;目标字符串的指针&#xff0c;用于存储格式化后的结果。format&#xff1a;格式化字符串&#xff0c;用于指定输出的格式。后续是…

IP地址SSL证书要怎么申请?

申请IP地址SSL证书的过程可以简化为以下四个步骤&#xff1a; 1. 选择证书提供商 确定需求&#xff1a;首先&#xff0c;明确你的需求&#xff0c;包括所需的证书类型&#xff08;如IP地址证书&#xff09;和加密算法等。选择CA机构&#xff1a;选择一个受信任的证书颁发机构…

有了这款低代码工具,从此让你告别烦人的996报表制作模式

一、低代码平台兴起的背景 近年来&#xff0c;低代码与零代码平台的兴起&#xff0c;无疑是IT领域的一股强劲风潮&#xff0c;它们依托互联网技术的飞速进步&#xff0c;致力于简化软件开发流程&#xff0c;推动工具向更加易用、高效的方向演进。在这一浪潮中&#xff0c;尽管…

重塑工程机械设备市场:创新网络推广方案引领潮流

在重塑工程机械设备领域&#xff0c;网络营销推广已日益凸显为企业拓展市场版图、提升品牌知名度不可或缺的关键手段。鉴于互联网时代的海量信息与激烈竞争&#xff0c;关键词搜索排名优化更是成为了衡量网络推广成效的重要标尺。为了在这场数字战役中脱颖而出&#xff0c;我们…

二、测试的基本概念

文章目录 一、需求&#xff08;一&#xff09;需求的概念&#xff08;二&#xff09;用户需求&#xff08;三&#xff09;软件需求 二、从软件测试人员角度看需求&#xff08;一&#xff09;为什么需求对软件测试人员如此重要&#xff08;二&#xff09;如何才可以深入理解被测…

【论文速读】| ARVO: 开源软件可重现漏洞的全景图

本次分享论文&#xff1a;ARVO: Atlas of Reproducible Vulnerabilities for Open Source Software 基本信息 原文作者&#xff1a;Xiang Mei, Pulkit Singh Singaria, Jordi Del Castillo, Haoran Xi, Abdelouahab (Habs) Benchikh, Tiffany Bao, Ruoyu Wang, Yan Shoshitai…

Java Email发送:如何配置SMTP服务器发信?

Java Email发送性能如何优化&#xff1f;怎么实现Java发信功能&#xff1f; Java Email发送功能使得开发者能够轻松集成邮件服务到他们的应用程序中。通过配置SMTP服务器&#xff0c;Java Email发送可以实现高效、可靠的邮件传递。AokSend将详细介绍如何配置SMTP服务器以进行J…

10、ollama启动LLama_Factory微调大模型(llama.cpp)

在前面章节中介绍了如何使用LLama_Factory微调大模型&#xff0c;并将微调后的模型文件合并导出&#xff0c;本节我们我们看下如何使用ollama进行调用。 1、llama.cpp LLama_Factory训练好的模型&#xff0c;ollama不能直接使用&#xff0c;需要转换一下格式&#xff0c;我们…

Java面试——Spring

优质博文&#xff1a;IT-BLOG-CN 一、Spring Bean 作用域 【1】singleton&#xff1a;该属性在 IOC容器仅创建一个 Bean实例&#xff08;单例&#xff09;&#xff0c;IOC容器每次返回的是同一个 Bean实例。 【2】prototype&#xff1a;该属性在 IOC容器可以创建多个 Bean实例…

MT3608L 2.5A,高效率1.2MHz电流模式升压转换器芯片IC

一般描述 MT3608L是一款恒频、6针SOT23电流模式升压转换器&#xff0c;适用于小型、低功率应用。MT3608L开关频率为1.2 MHz&#xff0c;允许使用高度小于2mm的微型、低成本电容器和电感器。内部软启动可产生小浪涌电流&#xff0c;延长电池寿命。 MT3608L具有在…

事半功倍:利用增强现实提高工作效率

人们通常认为增强现实只是游戏中的一个强大的功能&#xff0c;然而&#xff0c;研究表明&#xff0c;增强现实在提高工厂的效率和生产力方面也发挥着重要作用。不管增强现实、虚拟现实还是混合现实都能很好地模拟工厂的工作场景&#xff0c;这对于培训、运营、安全和研发方面的…

ip地址暴露有什么危害?怎么隐藏ip地址

在数字化时代&#xff0c;‌IP地址作为网络世界的“门牌号”&#xff0c;‌扮演着连接用户与互联网的重要角色。‌然而&#xff0c;‌随着网络环境的日益复杂&#xff0c;‌IP地址的暴露可能成为个人隐私泄露和网络攻击的风向标。‌本文将深入探讨IP地址暴露的危害&#xff0c;…

【pgAdmin4】Windows 上安装 PostgreSQL(图文详情)

目录 0.背景 1.简介 2.安装步骤 1&#xff09;下载地址 2&#xff09;双击安装包进行下载【请以管理员身份打开并安装】 3&#xff09;安装步骤 4&#xff09;安装中 5&#xff09;安装完成 0.背景 最近在学习大数据规模处理的相关课程&#xff0c;需要安装这个数据库以…

快速安全部署 Tomcat

主机环境 IP域名用途172.25.254.10tomcat1.orgTomcat172.25.254.20tomcat2.orgTomcat172.25.254.30nginx-server.orgNginx 负载均衡 Tomcat 安装 172.25.254.10 # 安装JAVA [roottomcat1 ~]# yum install java-1.8.0-openjdk.x86_64 -y # 下载Tomcat,推荐在Windows主机下载…

EE trade:贵金属包括哪些

贵金属&#xff0c; 顾名思义&#xff0c; 是指价值贵重的金属&#xff0c; 它们因其独特的性质和稀缺性&#xff0c; 在人类历史上扮演着重要的角色。 从古代的装饰品到现代的工业材料&#xff0c; 贵金属一直受到人们的追捧。 一、 八大贵金属&#xff1a; 稀有珍贵&#xf…

首批河南省“人工智能+高等教育” 典型应用场景公布

河南省在推进高等教育与人工智能技术融合方面迈出了重要步伐。 近期&#xff0c;河南省教育厅公布了首批“人工智能高等教育”典型应用场景案例认定名单&#xff0c;此举标志着省级教育部门对高校在AI应用方面的积极探索和实践给予了高度认可和支持。 经过严格的申报审核、会…

夜深了,赶紧根据软件系统建模建设一个房屋租赁服务系统,坐上收租大佬宝座,走上人生巅峰

目录 案例 【题目】 【问题 1】(12 分) 【问题 2】(5 分) 【问题 3】(8 分) 【答案】 【问题 1】答案 【问题 2】答案 【问题 3】答案 相关推荐 案例 阅读以下关于软件系统建模的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某公司欲建设一个房屋租赁服务…

图像去模糊技术分享

图像去模糊是图像处理领域中的一个技术过程&#xff0c;旨在恢复或提高模糊图像的清晰度&#xff0c;减少因各种原因&#xff08;如运动、焦点不准等&#xff09;导致的图像模糊。图像去模糊技术对于提高图像质量&#xff0c;增强视觉效果&#xff0c;以及在诸如医疗成像、卫星…

鸿蒙( Beta5.0版)开发实战:自定义TabBar页签

介绍 本示例主要介绍了TabBar中间页面如何实现有一圈圆弧外轮廓以及TabBar页签被点击之后会改变图标显示&#xff0c;并有一小段动画效果。 效果图预览 使用说明&#xff1a; 依次点击tabBar页面&#xff0c;除了社区图标之外&#xff0c;其它图标往上移动一小段距离。 实现…

内网穿透的应用-如何使用跨平台终端Tabby结合内网穿透工具异地远程ssh访问Ubuntu系统

文章目录 前言1. Tabby下载安装2. Tabby相关配置3. Tabby简单操作4. ssh连接Linux4.1 ubuntu系统安装ssh4.2 Tabby远程ssh连接ubuntu 5. 安装内网穿透工具5.1 创建公网地址5.2 使用公网地址远程ssh连接 6. 配置固定公网地址 前言 今天和大家分享一下如何在Windows系统使用Tabb…