二维点云数据拟合直线或曲线方程【sick二维激光雷达测距仪】

news2024/9/20 17:59:22

文章目录

  • 前言
  • 一、滤波、去除离散点方法
  • 二、拟合成线
  • 三、拟合多条线


前言

小白一枚,进行实验之前,首先要明确一下思路:

1、为何要进行拟合,首先搞清楚你的需求、你要实现的目标。
2、二维数据拟合成线,首先要做的就是滤波、去除离散点,否则对拟合的效果影响很大。
3、如何拟合单条【本文以直线为例】、拿到它的方程式,并进行可视化展示。
4、若要拟合多条线【本文以直线为例】是否可行?实现思路是怎样的。


一、滤波、去除离散点方法

我比较常用的是条件滤波,去除离散点常用的是StatisticalOutlierRemoval 和 RadiusOutlierRemoval
下面写几个例子,并给出了完整代码:

1、条件滤波:
条件滤波是拿到你给定x\y\z区间内的点云。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/extract_indices.h>
#include <iostream>
#include <vector>
#include <cmath>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
using namespace std;

int main() {
    // 读取点云文件    20230906_103819.pcd
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("20230906_103603.pcd", *cloud) == -1) {
        std::cerr << "Failed to load the PCD file." << std::endl;
        return (-1);
    }
    std::cout << "Loaded "
        << cloud->width * cloud->height
        << " data points from the PCD file." << std::endl;
    //创建容器保存过滤后的点
    pcl::PointCloud<pcl::PointXYZ>::Ptr conditionCloud(new pcl::PointCloud<pcl::PointXYZ>);
    //创建条件滤波,设置滤波条件
    pcl::ConditionAnd<pcl::PointXYZ>::Ptr rangeCondOrigin(new pcl::ConditionAnd<pcl::PointXYZ>());
    //这里我设置的范围是x从-2到1,y从-0.5到10.0,关于开闭区间,可以自行修改
    rangeCondOrigin->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("y", pcl::ComparisonOps::GT, -0.5)));
    rangeCondOrigin->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("y", pcl::ComparisonOps::LT, 10.0)));
    rangeCondOrigin->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::GT, -2)));
    rangeCondOrigin->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::LT, 1)));
    
    // 执行点云移除处理,并将剩下的点添加到 conditionCloud(刚刚创建的容器,现在得到的就是过滤后的点云)
    pcl::ConditionalRemoval<pcl::PointXYZ> condremOrigin(rangeCondOrigin, false);
    condremOrigin.setInputCloud(cloud);
    condremOrigin.setKeepOrganized(false);
    condremOrigin.filter(*conditionCloud);

	//可视化显示过滤后的点云
    pcl::visualization::PCLVisualizer viewer("Point Cloud Viewer");
    viewer.addPointCloud<pcl::PointXYZ>(conditionCloud, "conditionCloud");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "conditionCloud");
    viewer.setBackgroundColor(0, 0, 0); // 设置背景色为黑色

	while (!viewer.wasStopped()) {
        viewer.spinOnce(100);
    }

    return 0;
}

2、RadiusOutlierRemoval去除离散点
过滤掉不符合搜索半径内邻居点数目的将被过滤掉。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/extract_indices.h>
#include <iostream>
#include <vector>
#include <cmath>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
using namespace std;

int main() {
    // 读取点云文件    
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("20230906_103603.pcd", *cloud) == -1) {
        std::cerr << "Failed to load the PCD file." << std::endl;
        return (-1);
    }
    
	pcl::RadiusOutlierRemoval<pcl::PointXYZ> sorCloud;  //创建滤波器对象
    sorCloud.setInputCloud(cloud);             //设置待滤波的点云
    sorCloud.setRadiusSearch(0.01);               // 设置搜索半径
    sorCloud.setMinNeighborsInRadius(3);      // 设置一个内点最少的邻居数目

    // 创建一个容器对象来保存滤波后的点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr radiusCloud(new pcl::PointCloud<pcl::PointXYZ>);
    sorCloud.filter(*radiusCloud);
    //可视化窗口
    pcl::visualization::PCLVisualizer viewer("Point Cloud Viewer");
    viewer.addPointCloud<pcl::PointXYZ>(radiusCloud, "radiusCloud");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "radiusCloud");
    viewer.setBackgroundColor(0, 0, 0); // 设置背景色为黑色

	while (!viewer.wasStopped()) {
        viewer.spinOnce(100);
    }
    return 0}

二、拟合成线

三、拟合多条线

太累了,明天再写。。。。。。。。。。。

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

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

相关文章

LLM World:轻松驾驭大模型价格

当今&#xff0c;人工智能蓬勃发展&#xff0c;大模型的应用也如繁星般不断涌现。 大模型提供商为了在竞争激烈的市场中脱颖而出并获取最大利润&#xff0c;往往采用复杂的差异化定价策略。不同的功能模块、使用场景&#xff08;如企业级应用、科研用途、小型创业公司试用等&a…

数据结构-2.8.单链表的建立

一.尾插法建立单链表&#xff1a;取数据元素插入单链表表尾 1.图解&#xff1a; 对于时间复杂度&#xff0c;最好的时间复杂度是第一次&#xff0c;因为此时内层循环即找第i-1个结点就不执行了(不满足j<i-1)&#xff0c; 内层循环和外层循环时间复杂度都是O(n)&#xff0c…

devops的道法术器

devops的道法术器 道、法、术、器自上而下是系统思考的层次&#xff0c;自下而上是解决问题的层次 “道”是目标、价值观&#xff0c;对价值的定位。 快速交付价值&#xff0c;灵活响应变化&#xff0c;这是从价值层面的追求&#xff0c;或者是从第一性原理的角度来讲&#xf…

相亲交友系统 现代爱情的导航仪

在这个数字化的时代&#xff0c;人们的生活方式发生了翻天覆地的变化&#xff0c;其中最显著的变化之一便是交友方式的转变。编辑h17711347205随着社会节奏的加快&#xff0c;越来越多的人选择通过相亲交友系统来寻找人生伴侣。相亲交友系统不仅简化了传统的交友流程&#xff0…

pig4cloud自定义SecurityFilterChain、Filter

1. 环境 SpringBoot版本&#xff1a;2.7.16 SpringSecurity版本&#xff1a;5.7.11 pig4cloud版本&#xff1a;3.7.1-JDK8 2. 概述 pig4cloud也没有自定义SecurityFilterChain的实现&#xff0c;还是基于SpringSecurity去实现的。但是pig4cloud使用的SpringSecurity的5.7.…

鸿蒙手势交互(四:多层手势)

四、多层手势 指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。有两种&#xff0c;一种默认多层级手势事件&#xff0c;一种自定义多层级手势事件。 默认多层级手势事件&#xff1a;需要分清两个概念&#xff0c;触摸事件&#xff0c;手势与事件 触摸事件&#xf…

MySQL数据库:掌握备份与恢复的艺术,确保数据安全无忧(二)

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 ​编辑 正…

springbootKPL比赛网上售票系统

基于springbootvue实现的KPL比赛网上售票系统 &#xff08;源码L文ppt&#xff09;4-068 4.2 系统结构设计 架构图是系统的体系结构&#xff0c;体系结构是体系结构体系的重要组成部分。KPL比赛网上售票系统的总体结构设计如图4-2所示。 图4-2 系统总体架构图 4.3数据…

【Java面向对象二】static(二)修饰成员方法的应用场景

文章目录 前言一、static修饰成员方法的应用场景二、使用例子三、工具类没有创建对象的需求&#xff0c;建议将工具类的构造方法进行私有总结 前言 记录学习过程中的工具类的使用。 一、static修饰成员方法的应用场景 1、类方法的常见应用场景 类方法最常见的应用场景是做工…

Java设计模式——工厂方法模式(完整详解,附有代码+案例)

文章目录 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现 5.3 工厂方法模式 针对5.2.3中的缺点&#xff0c;使用工厂方法模式就可以完美的解决&#xff0c;完全遵循开闭原则。 5.3.1概述 工厂方法模式&#xff1a;定义一个创建对象的接口&#xff08;这里的接口指的是工厂&…

01_WebRtc_一对一视频通话

文章目录 通话网页的设计客户端实现Web的API 服务端实现 2024-9-20 很久没有写博客啦&#xff0c;回顾总结这段时间的成果&#xff0c; 写下博客放松下&#xff08;开始偷懒啦&#xff09;主要内容&#xff1a;实现网页&#xff08;html&#xff09;打开摄像头并显示到页面需要…

泳池软管检测系统源码分享

泳池软管检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

C++: 使用红黑树模拟实现STL中的map和set

目录 1. 红黑树的迭代器和-- 2. 改造红黑树3. set的模拟实现4. map的模拟实现5. RBTree的改造代码 博客主页 : 酷酷学 正文开始 1. 红黑树的迭代器 迭代器的好处是可以方便遍历&#xff0c;是数据结构的底层实现与用户透明 打开C的源码我们可以发现, 其实源码中的底层大概如…

数据结构应试-树和二叉树

1. 2. 结点的度&#xff1a;结点拥有的子树数量称为结点的度 树的度&#xff1a;树内各结点度的最大值&#xff0c;即上图 D 结点的度就是此树的度 叶子&#xff1a;度为 0 的节点称为叶子或终端节点 结点的层次和树的深度 森林&#xff1a;m棵互不相交的树的集合。 3. 为啥…

司南 OpenCompass 九月大语言模型评测榜单启动召集,欢迎新合作厂商申请评测

主要概览 司南 OpenCompass 大语言模型官方自建榜单&#xff08;9 月榜&#xff09;评测拟定于 10 月上旬发布&#xff0c;现诚挚邀请新加入的合作方参与评测。本次评测围绕强化能力维度&#xff0c;全面覆盖语言、推理、知识、代码、数学、指令跟随、智能体等七大关键领域&am…

layui时间选择器选择周 日月季度年

<!-- layui框架样式 --><link type"text/css" href"/static/plugins/layui/css/layui.css" rel"stylesheet" /><!-- layui框架js --><script type"text/javascript" src"/static/plugins/layui/layui.js&qu…

【LeetCode】每日一题 2024_9_20 统计特殊整数(数位 DP)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;统计特殊整数 代码与解题思路 func countSpecialNumbers(n int) int { // 今天的题目是数位 DP&#xff0c;我不会做&#xff0c;所以现场学习了一下灵神的数位 DP 模版s : strconv.Itoa…

11个推特大V发文推广的数据分析技巧

社交媒体已经成为了现代社会中不可或缺的一部分&#xff0c;而推特作为其中的重要一员&#xff0c;吸引了许多用户。对于那些成千上万的粉丝拥有者&#xff08;也被称为“大V”&#xff09;&#xff0c;他们能够有效地利用推特平台&#xff0c;推广自己的观点和产品。我们将介绍…

让医院更智慧,让决策更容易

依托数字孪生技术&#xff0c;赋能智慧医院&#xff0c;对使用者和决策者带来了众多的优势。数字孪生技术是将物理实体与数字模型相结合&#xff0c;实现实时监测、仿真预测和智能决策的一种先进技术。在智慧医院中应用数字孪生技术&#xff0c;不仅可以提升医疗服务的质量和效…

阿里云容器服务Kubernetes部署新服务

这里部署的是前端项目 1.登录控制台-选择集群 2.选择无状态-命名空间-使用镜像创建 3.填写相关信息 应用基本信息&#xff1a; 容器配置&#xff1a; 高级配置&#xff1a; 创建成功后就可以通过30006端口访问项目了