PCL 平面拟合方法 对比

news/2024/3/29 16:40:39/文章来源:https://blog.csdn.net/xinjiang666/article/details/129160544

目录

一、最小二乘法 (Least Squares, LS)

二、采样一致性(Sample Consensus)方法

2.1 pcl::LeastMedianSquares (LMedS)

2.2 pcl::RandomSampleConsensus (RANSAC)

2.3 pcl::MEstimatorSampleConsensus (MSAC)

2.4 pcl::RandomizedRandomSampleConsensus (RRANSAC)

2.5 pcl::RandomizedMEstimatorSampleConsensus (RMSAC)

2.6 pcl::MaximumLikelihoodSampleConsensus (MLESAC)

2.7 pcl::ProgressiveSampleConsensus (PROSAC)

三、结果与对比(XBB)


一、最小二乘法 (Least Squares, LS)

分享给有需要的人,代码质量勿喷

void main()
{//loadpcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("F:/test.pcd", *cloud);//matint pCount = cloud->points.size();Eigen::MatrixXd matPoints(pCount, 3);for (int i = 0; i < pCount; i++){matPoints(i, 0) = cloud->points.at(i).x;matPoints(i, 1) = cloud->points.at(i).y;matPoints(i, 2) = cloud->points.at(i).z;}//-质心Eigen::RowVector3d centroid = matPoints.colwise().mean();Eigen::MatrixXd A = matPoints;A.rowwise() -= centroid;//SVDEigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);Eigen::Matrix3d V = svd.matrixV();Eigen::MatrixXd U = svd.matrixU();Eigen::Matrix3d S = U.inverse() * A * V.transpose().inverse();// S = U^-1 * A * VT * -1//ax+by+cz+d=0Eigen::RowVector3d normal;normal << V(0, 2), V(1, 2), V(2, 2);double nd = -normal * centroid.transpose();double na = V(0, 2);double nb = V(1, 2);double nc = V(2, 2);if (nc < 0)//同向(0,0,1){na *= (-1);nb *= (-1);nc *= (-1);nd *= (-1);}
}

二、采样一致性(Sample Consensus)方法

pcl::SampleConsensusicon-default.png?t=N176https://pointclouds.org/documentation/classpcl_1_1_sample_consensus.html#details

Point Cloud Library (PCL): pcl::SampleConsensus< T > Class Template Reference (pointclouds.org)

2.1 pcl::LeastMedianSquares (LMedS)

2.2 pcl::RandomSampleConsensus (RANSAC)

2.3 pcl::MEstimatorSampleConsensus (MSAC)

2.4 pcl::RandomizedRandomSampleConsensus (RRANSAC)

2.5 pcl::RandomizedMEstimatorSampleConsensus (RMSAC)

2.6 pcl::MaximumLikelihoodSampleConsensus (MLESAC)

2.7 pcl::ProgressiveSampleConsensus (PROSAC)

分享给有需要的人,代码质量勿喷

void main()
{//loadpcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("F:/test.pcd", *cloud);//SAC Planepcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_plane(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));//fit methodpcl::LeastMedianSquares<pcl::PointXYZ> fitMethod(model_plane);//pcl::RandomSampleConsensus<pcl::PointXYZ> fitMethod(model_plane);//pcl::MEstimatorSampleConsensus<pcl::PointXYZ> fitMethod(model_plane);//pcl::RandomizedRandomSampleConsensus<pcl::PointXYZ> fitMethod(model_plane);//pcl::RandomizedMEstimatorSampleConsensus<pcl::PointXYZ> fitMethod(model_plane);//pcl::MaximumLikelihoodSampleConsensus<pcl::PointXYZ> fitMethod(model_plane);//pcl::ProgressiveSampleConsensus<pcl::PointXYZ> fitMethod(model_plane);fitMethod.setDistanceThreshold(0.01);//距离阈值fitMethod.computeModel();//面参数 ax+by+cz+d=0Eigen::VectorXf coefficient;fitMethod.getModelCoefficients(coefficient);double na = coefficient[0];double nb = coefficient[1];double nc = coefficient[2];double nd = coefficient[3];if (nc < 0){na = -na;nb = -nb;nc = -nc;nd = -nd;}//内点std::vector<int> inliers;//存储内点索引的向量fitMethod.getInliers(inliers);//提取内点对应的索引pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane(new pcl::PointCloud<pcl::PointXYZ>);pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *cloud_plane);
}

三、结果与对比(XBB)

感觉有些结果不大合理,但是不重要,嘻嘻。

fit methodabcd

Least Squares

LS

0.009383280.01452690.999856.47668

CloudCompare-Plane-Fit

LS

0.009383280.0145270.99985

LeastMedianSquares

LMedS

0.01060590.01296230.999866.44786

RandomSampleConsensus

RANSAC

0.01774470.008363390.9998086.35407

MEstimatorSampleConsensus

MSAC

0.01774470.008363390.9998086.35407

RandomizedRandomSampleConsensus

RRANSAC

-0.1841710.2667170.94601410.666

RandomizedMEstimatorSampleConsensus

RMSAC

-0.1841710.2667170.94601410.666

MaximumLikelihoodSampleConsensus

MLESAC

0.01176520.02091680.9997126.55405

ProgressiveSampleConsensus

PROSAC

0.01176520.02091680.9997126.55405

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题

解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题问题官网下载解压驱动包编译安装给驱动签名再来载入模块&#xff08;设备驱动程序&#xff09;问题 Ubuntu22.04.1 Linux版本5.19.0-32-generic 运行Qt串口通信 m_serialPort->open(QIO…

数组类模板

要求&#xff1a;设计一个数组模板类&#xff08;MyArray&#xff09;&#xff0c;完成对不同类型元素的管理操作步骤设计头文件在 qtcreate下先创建03_code的项目&#xff0c;然后右键点击03_code添加新文件&#xff0c;点击头文件&#xff0c;点击Choose命名为 myarry.hpp&am…

[黑马程序员SSM框架教程]03 spring核心概念

IOC/DI 书写现状&#xff1a;耦合度偏高 如图&#xff1a;传统书写代码左边业务层需要new一个对象进行业务实现。当数据层优化代码BookDaoImpl2就需要动业务层代码重新修改new的对象。导致代码耦合度偏高。 解决办法&#xff1a;使用对象&#xff0c;不要主动new对象&#xff…

设计模式.工厂模式.黑马跟学笔记

设计模式.工厂模式4.创建型模式4.2 工厂模式4.2.1 概述4.2.2 简单工厂模式4.2.2.1 结构4.2.2.2 实现4.2.2.4 优缺点4.2.2.3 扩展4.2.3 工厂方法模式4.2.3.1 概念4.2.3.2 结构4.2.3.3 实现4.2.3.4 优缺点4.2.4 抽象工厂模式4.2.4.1 概念4.2.4.2 结构4.2.4.2 实现4.2.4.3 优缺点4…

关于java8的List的stream流的foreach()方法问题探究(坑)与替代方案

一、起因 今天发现线上系统出现了一个bug&#xff0c; 我有一个“定时任务”每天凌晨触发&#xff0c;任务内容&#xff1a; ① 定时调用的系统暴漏的接口&#xff0c;来定时获取List<Object>数据。 ② 然后我会筛选出该List中符合条件的Object&#xff0c;对筛选出来的…

【Python入门第十五天】Python字典

字典&#xff08;Dictionary&#xff09; 字典是一个无序、可变和有索引的集合。在 Python 中&#xff0c;字典用花括号编写&#xff0c;拥有键和值。 实例 创建并打印字典&#xff1a; thisdict {"brand": "Porsche","model": "911&q…

科技新浪推前浪 ChatGPT将元宇宙“拍在沙滩上”?

近期ChatGPT的热度显然已经盖过了元宇宙&#xff0c;回想去年元宇宙大热之际&#xff0c;很多企业纷纷跟进&#xff0c;甚至还有不少公司选择更名以表达All In元宇宙的决心。而如今ChatGPT抢占风头&#xff0c;成为新宠&#xff0c;元宇宙似乎被“抛弃”了&#xff0c;难道元宇…

【React npm】从零搭建react脚手架,发布组件库到npm,并实现按需加载(二)

发布react组件库前情回顾介绍搭建脚手架配置babelrc配置jsconfig写入组件demo修改主入口文件配置生产环境webpack配置package.json发布实现按需加载前情回顾 前面写过一篇&#xff0c;发布单个组件到npm的&#xff1a; https://blog.csdn.net/tuzi007a/article/details/12911…

【HTML】HTML 表单 ⑤ ( form 表单域 )

文章目录一、form 表单域1、form 表单域作用2、form 表单域语法3、form 表单域 Get 请求4、form 表单域 Post 请求一、form 表单域 1、form 表单域作用 从 input 表单 , textarea 文本域 , select 下拉菜单 中收集了用户信息 , 需要通过 form 表单域 发送给 服务器端 ; 2、fo…

第十一章 - 模糊匹配(like)、正则匹配(REGEXP)、文本处理函数、时间处理函数

第十一章 - 模糊匹配&#xff08;like&#xff09;、正则匹配&#xff08;REGEXP&#xff09;、文本处理函数、时间处理函数模糊匹配和正则匹配like%通配符_通配符REGEXP 正则匹配文本拼接concat&#xff08;&#xff09;substring()substring_index()一些文本处理函数时间处理…

【计算机组成原理】求寻址范围(按字/按字节)

今天一道计算机组成原理的复习题一直没搞懂怎么做的&#xff0c;网上讲解求寻址范围题型的资料和视频也很少&#xff0c;花了半个晚上才搞懂。 首先&#xff0c;理解存储体&#xff0c;存储单元&#xff0c;存储字&#xff0c;存储元。&#xff08;文章末尾详细解释了) 以下是…

2022年休闲游戏市场总结

在预测 2023 年之前&#xff0c;我们先回顾一下 2022 年。从上一年发生的事件中往往能看到未来趋势的影子&#xff0c;所以 2022 年的总结至关重要。一、2022年总结回顾1、流行游戏类型回顾 2022 年&#xff0c;三种超休闲游戏表现最为突出&#xff1a;跑酷游戏&#xff1a;跑酷…

你知道IT运维的本质是什么吗?

大家好&#xff0c;我是技福的小咖老师。 之前看到个文章&#xff0c;说运维的本质是“可视化”&#xff0c;甚至还有人说是DevOps。不可否认&#xff0c;“可视化”是运维过程中非常重要的一个环节&#xff1b;DevOps则是开发运维一体化非常重要的工具。 究其根本&#xff0…

leetcode重点题目分类别记录(一)数据结构类

算法题分类别记录数组排序归并排序合并两有序数组归并排序快速排序荷兰旗问题快速排序堆排序基数排序滑动窗口/双指针N数之和四数相加链表环形链表重排链表LRU缓存栈与队列栈实现队列/队列实现栈最小栈/最小队列单调队列单调栈哈希表字符串字符串处理字符串匹配KMP子串二叉树二…

Dart的安装及环境变量配置

本文介绍dart的安装步骤及环境变量配置&#xff0c;以及如何在vscode中进行开发环境配置。一、dart的安装访问dart官网https://dart.cn/&#xff0c;点击网站右上角的获取DART SDK进行下载页面。如下图&#xff0c;选择下载SDK的zip压缩文件。根据自己的操作系统情况选择合适版…

吉卜力风格水彩画怎么画?

著名的水彩艺术家陈坚曾说&#xff1a;“水彩是用水润调和形成的饱和度极高的艺术画面&#xff0c;在纸上晕染的画面面积、强度等具有许多随意性&#xff0c;天空的颜色乌云密布&#xff0c;都是很随意的&#xff0c;难以模仿。” 是的&#xff0c;水彩画的妙处就在于不确定的…

apk中代码执行adb指令实现

背景&#xff1a;想要在android apk中直接使用adb指令&#xff0c;从而不需要把手机通过数据线方式连接到电脑&#xff0c;在电脑端执行adb指令。 一、权限相关 想要在apk代码中执行adb命令&#xff0c;涉及到执行权限。 首先手机需要有root权限。其次就算手机已经root了&…

(18)目标检测算法之数据集标签格式转换:json2txt、xml2txt

目标检测算法之数据集标签格式转换&#xff1a;json2txt、xml2txt 目标检测最常见的模型&#xff1a;YOLO&#xff0c;常见的几种标注方式&#xff1a;矩形框、旋转矩形框、实例分割中的多边形标注等类型&#xff0c;根据其标注标签&#xff0c;目标检测主要有以下两种转换方式…

Word中批量调整图片大小

当一个文档中图片较多&#xff0c;又需要调整图片大小时&#xff0c;这时可以通过“宏”执行代码来批量调整。打开一个Word文档。“AltF8"键打开宏。设置“宏名”&#xff0c;并单击“创建”。创建完宏后&#xff0c;将进入Visual Basic 编辑器界面。在代码编辑区全选&…

【面试题】TCP如何保证传输可靠性?TCP流量控制实现、拥塞控制、ARQ协议、停止等待ARQ、连续ARQ

文章目录1. TCP 如何保证传输的可靠性&#xff1f;2.TCP 如何实现流量控制&#xff1f;3.TCP 的拥塞控制是怎么实现的&#xff1f;3.ARQ 协议了解吗?4.停止等待 ARQ 协议5.连续 ARQ 协议1. TCP 如何保证传输的可靠性&#xff1f; 基于数据块传输 &#xff1a;应用数据被分割成…