PCL MLS上采样(基于法向量)

news2024/10/2 12:22:56

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 可视化原始点云和上采样后的点云

2.1.2 MLS 上采样

2.2完整代码

三、实现效果


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

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


一、概述

        MLS(Moving Least Squares)上采样 是一种用于平滑化和重建点云表面的技术。通过在点云中计算局部的加权平均,MLS 可以生成光滑的表面,并填补点云中的孔洞。此方法特别适合处理稀疏或有噪声的点云数据。

1.1原理

        MLS 上采样的核心原理是通过计算点的邻域来拟合一个局部表面(例如平面或曲面)。每个点会根据其邻域内的其他点进行调整,生成新的点,从而实现上采样。用法线信息可以提升表面细节的保留。

1.2实现步骤

  1. 读取点云数据。
  2. 设置 MLS 算法的参数,包括搜索半径和拟合选项。
  3. 进行上采样处理。
  4. 可视化原始点云和上采样后的点云。

1.3应用场景

  1. 点云平滑:去除点云中的噪声。
  2. 表面重建:在稀疏点云中填补孔洞。
  3. 特征保留:保持点云的几何特征。

二、代码实现

2.1关键函数

2.1.1 可视化原始点云和上采样后的点云

通过设置不同的视口和背景颜色,分别显示原始点云和上采样后的点云。

#include <pcl/visualization/pcl_visualizer.h>

// 可视化原始点云和上采样后的点云
void visualizePointClouds(
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 原始点云
    pcl::PointCloud<pcl::PointNormal>::Ptr upsampled_cloud)  // 上采样后的点云
{
    // 创建可视化器
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("MLS Upsampling Viewer"));

    // 设置视口1,显示原始点云
    int vp_1;
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);  // 创建左侧窗口
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);  // 设置白色背景
    viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);  // 添加标题
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 0, 255, 0);  // 设置颜色为绿色
    viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);  // 添加点云

    // 设置视口2,显示上采样后的点云
    int vp_2;
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);  // 创建右侧窗口
    viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);  // 设置浅灰色背景
    viewer->addText("Upsampled PointCloud", 10, 10, "vp2_text", vp_2);  // 添加标题
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointNormal> upsampled_color_handler(upsampled_cloud, 255, 0, 0);  // 设置颜色为红色
    viewer->addPointCloud(upsampled_cloud, upsampled_color_handler, "upsampled_cloud", vp_2);  // 添加上采样点云

    // 设置点的大小
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "original_cloud", vp_1);
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "upsampled_cloud", vp_2);

    // 启动可视化循环
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);  // 刷新可视化器
    }
}

2.1.2 MLS 上采样

在这个部分,我们设置 MLS 的参数并执行上采样处理。

// -----------------------------MLS 上采样---------------------------------
pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;  // 创建 MLS 上采样对象
mls.setInputCloud(cloud);  // 设置输入点云

// 设置 Kd 树搜索
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());  // 创建 Kd 树
mls.setSearchMethod(tree);  // 将 Kd 树设置为搜索方法

// 设置 MLS 参数
mls.setSearchRadius(0.1);  // 设置邻域搜索半径
mls.setComputeNormals(true);  // 启用法线计算,这对 MLS 处理非常重要
mls.setPolynomialFit(true);  // 启用多项式拟合,以便在每个局部邻域内进行表面拟合
mls.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal>::SAMPLE_LOCAL_PLANE);  // 设置上采样方法为局部平面采样
mls.setUpsamplingRadius(0.04);  // 设置上采样半径,控制新点的生成
mls.setUpsamplingStepSize(0.02);  // 设置上采样步长,控制点的分布
mls.setPolynomialOrder(2);  // 设置多项式拟合的阶数,通常选择2以获得较好的平滑效果

// 执行上采样处理
pcl::PointCloud<pcl::PointNormal>::Ptr upsampled_cloud(new pcl::PointCloud<pcl::PointNormal>);  // 存储上采样后的点云
mls.process(*upsampled_cloud);  // 进行上采样处理
std::cout << "上采样后点云的个数:" << upsampled_cloud->points.size() << std::endl;  // 输出上采样后的点云数量

2.2完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/surface/mls.h>
#include <pcl/search/kdtree.h>
#include <pcl/visualization/pcl_visualizer.h>

// 可视化原始点云和上采样后的点云
void visualizePointClouds(
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 原始点云
    pcl::PointCloud<pcl::PointNormal>::Ptr upsampled_cloud)  // 上采样后的点云
{
    // 创建可视化器
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("MLS Upsampling Viewer"));

    // 设置视口1,显示原始点云
    int vp_1;
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);  // 创建左侧窗口
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);  // 设置白色背景
    viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);  // 添加标题
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 0, 255, 0);  // 设置颜色为绿色
    viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);  // 添加点云

    // 设置视口2,显示上采样后的点云
    int vp_2;
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);  // 创建右侧窗口
    viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);  // 设置浅灰色背景
    viewer->addText("Upsampled PointCloud", 10, 10, "vp2_text", vp_2);  // 添加标题
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointNormal> upsampled_color_handler(upsampled_cloud, 255, 0, 0);  // 设置颜色为红色
    viewer->addPointCloud(upsampled_cloud, upsampled_color_handler, "upsampled_cloud", vp_2);  // 添加上采样点云

    // 设置点的大小
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "original_cloud", vp_1);
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "upsampled_cloud", vp_2);

    // 启动可视化循环
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);  // 刷新可视化器
    }
}

int main(int argc, char** argv)
{
    // -----------------------------读取点云数据---------------------------------
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("rectangle_cloud.pcd", *cloud) == -1)
    {
        PCL_ERROR("Couldn't read the PCD file!\n");
        return -1;  // 返回错误
    }
    std::cout << "原始点云的个数:" << cloud->points.size() << std::endl;  // 输出原始点云数量

    // -----------------------------MLS 上采样---------------------------------
    pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;  // 创建 MLS 上采样对象
    mls.setInputCloud(cloud);  // 设置输入点云

    // 设置 Kd 树搜索
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
    mls.setSearchMethod(tree);  // 将 Kd 树设置为搜索方法

    // 设置 MLS 参数
    mls.setSearchRadius(0.1);  // 设置邻域搜索半径
    mls.setComputeNormals(true);  // 启用法线计算,这对 MLS 处理非常重要
    mls.setPolynomialFit(true);  // 启用多项式拟合,以便在每个局部邻域内进行表面拟合
    mls.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal>::SAMPLE_LOCAL_PLANE);  // 设置上采样方法为局部平面采样
    mls.setUpsamplingRadius(0.04);  // 设置上采样半径,控制新点的生成
    mls.setUpsamplingStepSize(0.02);  // 设置上采样步长,控制点的分布
    mls.setPolynomialOrder(2);  // 设置多项式拟合的阶数,通常选择2以获得较好的平滑效果

    pcl::PointCloud<pcl::PointNormal>::Ptr upsampled_cloud(new pcl::PointCloud<pcl::PointNormal>);  // 存储上采样后的点云
    mls.process(*upsampled_cloud);  // 执行上采样处理
    std::cout << "上采样后点云的个数:" << upsampled_cloud->points.size() << std::endl;  // 输出上采样后点云数量

    // -----------------------------可视化原始点云和上采样后的点云---------------------------------
    visualizePointClouds(cloud, upsampled_cloud);  // 可视化函数

    return 0;
}

三、实现效果

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

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

相关文章

Redis-预热雪崩击穿穿透

预热雪崩穿透击穿 缓存预热 缓存雪崩 有这两种原因 redis key 永不过期or过期时间错开redis 缓存集群实现高可用 主从哨兵Redis Cluster开启redis持久化aof&#xff0c;rdb&#xff0c;尽快恢复集群 多缓存结合预防雪崩&#xff1a;本地缓存 ehcache redis 缓存服务降级&…

iPhone/iPad技巧:如何解锁锁定的 iPhone 或 iPad

“在我更新 iPhone 上的软件后&#xff0c;最近我遇到了iPhone 被锁定到所有者的消息&#xff0c;该如何解决&#xff1f;” 根据我们的研究&#xff0c;许多用户在 iOS 18 更新或恢复出厂设置后都会遇到同样的问题。只要出现问题&#xff0c;您就无法使用 iPhone 或 第 1 部分…

jenkins微服务

如果vim进去某个文件里&#xff0c;可以按键盘的向下键查阅其它部分 记得每天备份虚拟机的项目 一.在linux安装jenkins 1.上传文件 我们采用安装包的方式安装。 先用SShclient在/usr/local/下创建jenkins文件夹&#xff0c;然后向其中导入两个包 2.安装jenkins 再在控制…

「STL::queue」标准库适配器:priority_queue(优先队列)介绍|自定义比较运算(C++)

目录 概述 创建销毁 内部理解 构造析构 自定义比较 赋值重构 数据访问 内存管理 数据控制 Tips 概述 priority_queue 是一种C标准模板库STL中定义的一种序列容器&#xff0c;它允许你在运行时动态地进行堆操作。 priority_queue 可以自动管理内存&#xff0c;这意味…

使用阿里云试用资源快速部署web应用-dofaker为例

本文介绍使用阿里云的试用资源部署dofaker的方法&#xff0c;本教程主要作学习在阿里云部署web应用之用&#xff0c;部署好应用之后&#xff0c;可以在任何地点通过公网ip访问web应用。 一、创建云主机 登录阿里云账户之后&#xff0c;点击控制台&#xff1a; 点击云服务器EC…

基于SSM的大学生心理素质测评及咨询平台系统设计与实现(源码+定制+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

vscode中配置python虚拟环境

python虚拟环境作用 Python虚拟环境允许你为每个独立的项目创建一个隔离的环境&#xff0c;这样每个项目都可以拥有自己的一套Python安装包和依赖&#xff0c;不会互相影响。实际使用中&#xff0c;可以在vscode或pycharm中使用虚拟环境。 1.创建虚拟环境的方法&#xff1a; …

天呐!关于PyCharm你竟然一无所知?

PyCharm 是一种专为 Python 开发而设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由 JetBrains 开发。 以下是 PyCharm 的一些主要特点和常见的使用方法&#xff1a; 特点&#xff1a; 智能代码编辑&#xff1a;具有智能代码补全、语法检查、代码重构等功能&…

HISTCITE分析进阶

不可否认histcite是一个很好的文献分析的工具,他能很好的找到最重要的那几篇文章,同时也能找到研究的发文趋势、研究机构和著名的研究学者等。但是它是一个很老的软件,因而很多东西都没能跟上下载的分析。我在使用过程中,尝试做一些改变使其更好用,同时也做一些记录。 1.…

ROS学习笔记(三):VSCode集成开发环境快速安装,以及常用扩展插件配置

文章目录 前言VSCode集成开发环境1 安装VSCode2 VSCode扩展插件2.1 VSCode扩展插件模块介绍2.1 常用扩展插件配置一、语言支持类插件二、智能辅助类插件三、科学计算与数据分析类插件四、ROS开发相关插件 3 总结相关链接 前言 关于Ubuntu与ROS的常规安装&#xff0c;可以看这几…

数字经济与新质生产力:地理信息与遥感视角下的深度分析

在数字化浪潮的推动下&#xff0c;我们正见证着生产力的一次历史性飞跃。数字经济如何重塑生产力的三大要素&#xff1a;劳动对象、劳动资料和劳动者&#xff1f;让我们来深度分析数字经济如何推动新质生产力的发展。 一、数字经济与地理信息的融合 地理信息与遥感技术是数字…

如何在 Windows 10 上恢复未保存/删除的 Word 文档

您是否整夜都在处理重要的 word 文件&#xff0c;但忘记保存它&#xff1f;这篇文章是给你的。在这里&#xff0c;我们将解释如何恢复未保存的 word 文档。除此之外&#xff0c;您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生&#xff0c;每个人都了解丢失重要 W…

【Android 14源码分析】WMS-窗口显示-流程概览与应用端流程分析

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

资源《Arduino 扩展板1-LED灯》说明。

资源链接&#xff1a;Arduino 扩展板1-LED灯 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件主要有…

Pytorch实现RNN实验

一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络&#xff08;RNN&#xff09;的基本原理&#xff1a;通过构建一个基于RNN的诗歌生成模型&#xff0c;学会RNN是如何处理序列数据的&#xff0c;以及如何在…

计算机毕业设计Spark+PyTorch股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《SparkPyTorch股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣&#xff0c;股票投资已成为广大投资者的重要选择之一。然而&#xff0c;股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票分析方…

防sql注入的网站登录系统设计与实现

课程名称 网络安全 大作业名称 防sql注入的网站登录系统设计与实现 姓名 学号 班级 大 作 业 要 求 结合mysql数据库设计一个web登录页面密码需密文存放&#xff08;可以采用hash方式&#xff0c;建议用sha1或md5加盐&#xff09;采用服务器端的验证码&#…

今天推荐一个文档管理系统 Dorisoy.Pan

Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统&#xff0c;它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术&#xff0c;以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端&#xff0c;包括网站、Android、iO…

PID控制原理:看下这三个故事,你就明白了

一、PID的故事 小明接到这样一个任务&#xff1a;有一个水缸点漏水(而且漏水的速度还不一定固定不变)&#xff0c;要求水面高度维持在某个位置&#xff0c;一旦发现水面高度低于要求位置&#xff0c;就要往水缸里加水。 小明接到任务后就一直守在水缸旁边&#xff0c;时间长就觉…

Python | Leetcode Python题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; class Solution:def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:cur, curParent root, Nonewhile cur and cur.val ! key:curParent curcur cur.left if cur.val > key else cur.rightif cur i…