PCL 平面拟合方法 对比

news2024/11/28 4:46:49

目录

一、最小二乘法 (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()
{
	//load
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile("F:/test.pcd", *cloud);

	//mat
	int 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;

	//SVD
	Eigen::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=0
	Eigen::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()
{
	//load
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile("F:/test.pcd", *cloud);

	//SAC Plane
	pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_plane(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));

	//fit method
	pcl::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=0
	Eigen::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.coloradmin.cn/o/364362.html

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

相关文章

【Tomcat】IDEA编译Tomcat源码-手把手教程

一、环境准备Tomcat不同版本之间有一定的兼容性问题~如下图所示&#xff1a;官网地址&#xff1a;https://tomcat.apache.org/whichversion.html下载tomcat9官网上面的源码&#xff1a;这一篇文章主要是带着大家在自己的IDEA跑起来一个Tomcat。使用的版本是Tomcat9.0.55 和 JDK…

如何写出更加契合浙大MBA项目提面申请资料?

现在已经是2月中旬了&#xff0c;最近看到上海很多院校都已经公布了提前面批次相应时间了&#xff0c;等浙大复试工作结束&#xff0c;马上提前面批次时间也会出来。本人2023浙大提面也拿到了优秀&#xff0c;结合本人经验&#xff0c;今天给大家分享下申请材料该如何撰写&…

【论文阅读】Anti-Adversarially Manipulated Attributions for WSSS

一篇CVPR2021上的论文&#xff0c;用于弱监督分割及半监督分割 论文标题&#xff1a; Anti-Adversarially Manipulated Attributions for Weakly and Semi-Supervised Semantic Segmentation&#xff08;AdvCAM&#xff09; 作者信息&#xff1a; 代码地址&#xff1a; htt…

浅谈volatile关键字

文章目录1.保证内存可见性2.可见性验证3.原子性验证4.原子性问题解决5.禁止指令重排序6.JMM谈谈你的理解6.1.基本概念6.2.JMM同步规定6.2.1.可见性6.2.2.原子性6.2.3.有序性6.3.Volatile针对指令重排做了啥7.你在哪些地方用过Volatile&#xff1f;volatile是Java提供的轻量级的…

【消费战略】解读100个食品品牌丨元气森林 6年百亿的饮品黑马成功之道

元气森林成立于2016年&#xff0c;短短六年时间取得了近百亿营收的奇迹&#xff0c;成为让可口可乐、百事、娃哈哈、农夫山泉等消费巨头都无法忽视的对手。六年的成长堪比行业前辈20多年的积累&#xff0c;从这个角度而言&#xff0c;塔望咨询认为元气森林是成功的&#xff0c;…

电影《蚁人与黄蜂女:量子狂潮》观后感

上周看了电影《蚁人与黄蜂女&#xff1a;量子狂潮》&#xff0c;整体有一种像是打开了一座新世界的大门&#xff0c;探索新知的感觉&#xff0c;也许是电影3D效果或者现场原因&#xff0c;给人展示量子世界的时候&#xff0c;总是看不清楚画面细节&#xff0c;稍微有些模糊&…

一文读懂Linux中的进程、线程

一文读懂Linux中的进程、线程 大家好&#xff0c;我是木荣君&#xff0c;这次我们来聊一聊Linux中进程和线程。进程和线程的概念非常重要&#xff0c;本篇来详细介绍下这两者的概念。我们在实际开发中&#xff0c;经常会听到这两个词&#xff0c;如果我们不了解这些词背后的概念…

深入浅出C++ ——二叉搜索树

文章目录一、二叉搜索树概念二、二叉搜索树操作1. 二叉搜索树的查找2. 二叉搜索树的插入3. 二叉搜索树的删除三、二叉搜索树的实现四、二叉搜索树的性能分析一、二叉搜索树概念 二叉搜索树又称二叉排序树/二次查找树&#xff0c;它是一棵空树或者是每颗子树都具有以下性质的二叉…

Spring Boot 框架 集成 Knife4j(内含源代码)

Spring Boot 框架 集成 Knife4j&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87480176 目录Spring Boot 框架 集成 Knife4j&#xff08;内含源代码&#xff09;源代码下载链接地址&#xff1a;[htt…

Bmp图片格式介绍

Bmp图片格式介绍 介绍 BMP是英文Bitmap&#xff08;位图&#xff09;的简写&#xff0c;它是Windows操作系统中的标准图像文件格式&#xff0c;能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发&#xff0c;BMP位图格式理所当然地被…

JetPack板块—Android X解析

Android Jetpack简述 AndroidX 是Android团队用于在Jetpack中开发&#xff0c;测试&#xff0c;打包&#xff0c;发布和版本管理的开源项目。相比于原来的Android Support库,AndroidX 可以称得上是一次重大的升级改进。 和Support库一样&#xff0c;AndroidX与Android 操作系…

投出1000份简历,苦于软件测试没有项目经验,全部石沉大海,辞职5个月,我失业了......

想要找一份高薪的软件测试工作&#xff0c;简历项目必不可少&#xff08;即使是应届生&#xff0c;你也要写上实习项目&#xff09;。所以很多自学的朋友找工作时会碰到一个令人颇感绝望的拦路虎&#xff1a;个人并没有实际的项目工作经验怎么办&#xff1f; 怎么办&#xff1f…

6.1 反馈的基本概念及判断方法

一、反馈的基本概念 1、什么是反馈 反馈也称为 “回授”。在电子电路中&#xff0c;将输出量&#xff08;输出电压或输出电流&#xff09;的一部分或全部通过一定的电路形式作用到输入回路&#xff0c;用来影响其输入量&#xff08;放大电路的输入电压或输入电流&#xff09;…

【软件测试】接口自动化测试你真的会做吗?资深测试工程师的总结......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 目的&#xff1f; 通…

离线环境拷贝迁移 conda envs 环境(蛮力方法,3行命令)

前言 最近要使用 GPU 服务器做实验&#xff0c;可惜的是&#xff0c;有网络连接的服务器显卡旧&#xff0c;算力不够&#xff1b;显卡较新的机器没有联网。于是有需求将旧机器上配置好的 conda 环境迁移至新机器。网上给的默认方法生成 yaml 文件迁移等 需要联网&#xff0c;只…

孪生生产线:法兰工厂数据驱动的颠覆性创新

2018 年&#xff0c;世界经济论坛(WEF)携手麦肯锡公司共同倡议并正式启动了全球“灯塔工厂网络项目”(Lighthouse Network)&#xff0c;共同遴选率先应用工业革命 4.0 技术实现企业盈利和持续发展的创新者与示范者。这就使得工厂系统需要对各流水线及生产运行成本方面进行多角度…

Neuron Selectivity Transfer 原理与代码解析

paper&#xff1a;Like What You Like: Knowledge Distill via Neuron Selectivity Transfercode&#xff1a;https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/NST.py本文的创新点本文探索了一种新型的知识 - 神经元的选择性知识&#xff0c…

整型在内存中的存储(详细剖析大小端)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是整型在内存中的存储噢&#xff0c;现在&#xff0c;就让我们进入整型在内存中的存储的世界吧 数据类型详细介绍 整型在内存中的存储&#xff1a;原码、反码、补码 大小端字节序介绍及判断 数据类型介绍 前面我们已经学…

【扫盲】数字货币科普对于完全不了解啥叫比特币的小伙伴需要的聊天谈资

很多人并不清楚&#xff0c;我们时常听说的比特币&#xff0c;以太坊币&#xff0c;等等这些东西到底是一场骗局还是一场货币革命&#xff1f; 下面就围绕这数字货币的历史以及一些应用场景开始分析这个问题。 一、 开端 一切从2008年中本聪&#xff08;Satoshi Nakamoto&…

shiro反序列化漏洞与无依赖CB链分析

环境搭建 git clone https://github.com/apache/shiro cd shiro git checkout shiro-root-1.2.4将 shiro/samples/web/pom.xml 中的jstl依赖改为1.2: <dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version&g…