当前位置: 首页 > article >正文

PCL (Matlab)拟合椭球

一、椭球点云数学模型二、PCL生成点云int main() { // 生成椭球点云 噪声 pcl::PointCloudpcl::PointXYZ::Ptr cloud( new pcl::PointCloudpcl::PointXYZ); // 椭球参数 float a 2.0f; // x轴 float b 1.5f; // y轴 float c 1.0f; // z轴 int N 20000; // 随机数 std::default_random_engine gen; std::uniform_real_distributionfloat dist_u(-1.0f, 1.0f); std::uniform_real_distributionfloat dist_phi(0.0f, 2 * M_PI); std::normal_distributionfloat noise(0.0f, 0.02f); // σ0.02 for (int i 0; i N; i) { float u dist_u(gen); float phi dist_phi(gen); float theta acos(u); // 椭球点 float x a * sin(theta) * cos(phi); float y b * sin(theta) * sin(phi); float z c * cos(theta); // -------- 法向噪声 -------- float nx x / (a * a); float ny y / (b * b); float nz z / (c * c); float norm sqrt(nx * nx ny * ny nz * nz); nx / norm; ny / norm; nz / norm; float eps noise(gen); pcl::PointXYZ p; p.x x eps * nx; p.y y eps * ny; p.z z eps * nz; cloud-points.push_back(p); } cloud-width cloud-points.size(); cloud-height 1; cloud-is_dense false; pcl::io::savePCDFileASCII(ellipsoid_noise.pcd, *cloud); std::cout Ellipsoid point cloud generated! std::endl; system(pause); return 0; }三、拟合1、模型2、SVD拟合1、构造线性方程2、写成矩阵的方式3、SVD 求解3、从一般二次曲面恢复“椭球参数”SVD 的问题必须知道❌ 不是最小几何距离❌ 对噪声敏感❌ 可能拟合成双曲面所以必须4、LM 非线性优化核心1、 参数化椭球推荐用中心c旋转R半轴a,b,c2、残差关键3、LM 目标四、Matlab PCL测试流程点云↓SVDDLT↓提取中心 轴↓LM 精化↓高精度椭球Matlab % 构造点 [X,Y,Z] sphere(200); X 2*X(:); Y 1.5*Y(:); Z 1*Z(:); % 加噪声 X X 0.05*randn(size(X)); Y Y 0.05*randn(size(Y)); Z Z 0.05*randn(size(Z)); % 构造 A A [X.^2 Y.^2 Z.^2 X.*Y X.*Z Y.*Z X Y Z ones(size(X))]; % SVD [~,~,V] svd(A); p V(:,end); disp(p) -0.1663 -0.2954 -0.6623 -0.0000 0.0006 -0.0001 0.0001 0.0009 0.0007 0.6681 PCL 测试1、构造矩阵用 EigenEigen::MatrixXd A(N,10); for (int i0;iN;i) { double x cloud-points[i].x; double y cloud-points[i].y; double z cloud-points[i].z; A.row(i) x*x, y*y, z*z, x*y, x*z, y*z, x, y, z, 1.0; }2、SVDEigen::JacobiSVDEigen::MatrixXd svd(A, Eigen::ComputeFullV); Eigen::VectorXd p svd.matrixV().col(9);3、构造二次曲面矩阵 QEigen::Matrix4d Q; Q p(0), p(3)/2, p(4)/2, p(6)/2, p(3)/2, p(1), p(5)/2, p(7)/2, p(4)/2, p(5)/2, p(2), p(8)/2, p(6)/2, p(7)/2, p(8)/2, p(9);4、提取椭球中心Eigen::Matrix3d Q3 Q.block3,3(0,0); Eigen::Vector3d q Q.block3,1(0,3); Eigen::Vector3d center -Q3.inverse() * q;5、提取椭球半轴初值double constant Q(3,3) q.transpose() * center; Eigen::Matrix3d M Q3 / (-constant); // 特征分解 Eigen::SelfAdjointEigenSolverEigen::Matrix3d es(M); Eigen::Vector3d eigenvalues es.eigenvalues(); Eigen::Matrix3d eigenvectors es.eigenvectors(); // 半轴长度 Eigen::Vector3d axes; axes(0) 1.0 / sqrt(eigenvalues(0)); axes(1) 1.0 / sqrt(eigenvalues(1)); axes(2) 1.0 / sqrt(eigenvalues(2));6、残差函数核心-LM 优化struct EllipsoidResidual { EllipsoidResidual(double x, double y, double z) : x_(x), y_(y), z_(z) {} template typename T bool operator()(const T* const param, T* residual) const { // param [cx, cy, cz, a, b, c] T dx (T(x_) - param[0]) / param[3]; T dy (T(y_) - param[1]) / param[4]; T dz (T(z_) - param[2]) / param[5]; residual[0] dx*dx dy*dy dz*dz - T(1); return true; } double x_, y_, z_; };7、构建优化问题-LM 优化double param[6] { center(0), center(1), center(2), axes(0), axes(1), axes(2) }; ceres::Problem problem; for (int i 0; i N; i) { auto pt cloud-points[i]; ceres::CostFunction* cost new ceres::AutoDiffCostFunctionEllipsoidResidual, 1, 6( new EllipsoidResidual(pt.x, pt.y, pt.z)); problem.AddResidualBlock(cost, nullptr, param); }8、设置优化参数-LM 优化ceres::Solver::Options options; options.linear_solver_type ceres::DENSE_QR; options.minimizer_progress_to_stdout true; ceres::Solver::Summary summary; ceres::Solve(options, problem, summary);9、输出结果std::cout Center: param[0] , param[1] , param[2] std::endl; std::cout Axes: param[3] , param[4] , param[5] std::endl;10、误差评估必须做double err 0; for (auto pt : cloud-points) { double dx (pt.x - param[0]) / param[3]; double dy (pt.y - param[1]) / param[4]; double dz (pt.z - param[2]) / param[5]; double r dx*dx dy*dy dz*dz - 1; err r*r; } err / cloud-size(); std::cout Mean error: err std::endl;

相关文章:

PCL (Matlab)拟合椭球

一、椭球点云数学模型二、PCL生成点云int main() {// 生成椭球点云 噪声pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 椭球参数float a 2.0f; // x轴float b 1.5f; // y轴float c 1.0f; // z轴int N 20000;// 随机数…...

如何在5分钟内开始使用Ivy Wallet:新手入门教程

如何在5分钟内开始使用Ivy Wallet&#xff1a;新手入门教程 【免费下载链接】ivy-wallet Ivy Wallet is an open-source money manager app for android that you can either build or download from Google Play. 项目地址: https://gitcode.com/gh_mirrors/iv/ivy-wallet …...

foobox-cn:让foobar2000焕发新生的界面美化方案

foobox-cn&#xff1a;让foobar2000焕发新生的界面美化方案 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你是否厌倦了foobar2000单调的默认界面&#xff1f;是否希望在享受高品质音乐的同时&#…...

零基础玩转像素心智:手把手教你用情绪解码器分析用户评论

零基础玩转像素心智&#xff1a;手把手教你用情绪解码器分析用户评论 1. 认识像素心智情绪解码器 1.1 什么是情绪解码器 像素心智情绪解码器(Pixel Mind Decoder)是一款基于M2LOrder核心引擎构建的AI情绪识别工具。它将复杂的自然语言处理技术封装在一个充满复古游戏风格的1…...

Modern.js 多环境配置终极指南:开发、测试、预发布与生产环境的完整实践

Modern.js 多环境配置终极指南&#xff1a;开发、测试、预发布与生产环境的完整实践 【免费下载链接】modern.js Modern.js is a web engineering system, including a web framework and a npm package solution. 项目地址: https://gitcode.com/gh_mirrors/mo/modern.js …...

Arduino-IRremote代码调试技巧:10个高效解决开发难题的方法

Arduino-IRremote代码调试技巧&#xff1a;10个高效解决开发难题的方法 【免费下载链接】Arduino-IRremote Infrared remote library for Arduino: send and receive infrared signals with multiple protocols 项目地址: https://gitcode.com/gh_mirrors/ar/Arduino-IRremot…...

对于多轮对话中的对话策略优化,OpenClaw 的在线强化学习更新频率?

关于OpenClaw在多轮对话中对话策略的在线强化学习更新频率&#xff0c;其实并没有一个公开的、固定的官方数字。这倒不是因为它是什么秘密&#xff0c;而是因为这类系统的更新机制往往不是按“每隔几秒一次”这样刻板的方式来运作的。它更像是一个动态调整的过程&#xff0c;取…...

思考时爱用手托腮?警惕单侧发力拖垮颈肩平衡

很多人在工作、学习或思考时&#xff0c;习惯用手托腮&#xff0c;这个看似不经意的动作&#xff0c;会给颈肩带来持续负担&#xff0c;引发肌肉失衡劳损。用手托腮时&#xff0c;头部会向一侧倾斜&#xff0c;颈椎处于侧屈状态&#xff0c;颈部一侧肌肉持续紧张、牵拉&#xf…...

SeqGPT-560M智能客服问答系统部署指南

SeqGPT-560M智能客服问答系统部署指南 1. 引言 想象一下这样的场景&#xff1a;你的电商平台每天收到上千条客户咨询&#xff0c;从"这个衣服有货吗"到"怎么申请退货"&#xff0c;问题五花八门。传统客服需要一个个手动回复&#xff0c;效率低下还容易出…...

终极指南:用30亿参数Qwen2.5-VL-3B解锁企业级视觉语言能力

终极指南&#xff1a;用30亿参数Qwen2.5-VL-3B解锁企业级视觉语言能力 【免费下载链接】Qwen2.5-VL-3B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen2.5-VL-3B-Instruct 你是否曾被大型视觉语言模型的高昂部署成本所困扰&#xff1f;是否因为硬件限…...

终极指南:如何将Squire富文本编辑器与现代前端工具链完美集成

终极指南&#xff1a;如何将Squire富文本编辑器与现代前端工具链完美集成 【免费下载链接】Squire The rich text editor for arbitrary HTML. 项目地址: https://gitcode.com/gh_mirrors/sq/Squire Squire是一个轻量级、高性能的HTML5富文本编辑器&#xff0c;专为处理…...

如何用anyRTC-RTMP-OpenSource打造个性化直播数据源:自定义视频采集完整指南

如何用anyRTC-RTMP-OpenSource打造个性化直播数据源&#xff1a;自定义视频采集完整指南 【免费下载链接】anyRTC-RTMP-OpenSource RTMP 推流器&#xff0c;RTMP(HLS)秒开播放器&#xff0c;直播点播&#xff0c;跨平台&#xff08;Win,IOS,Android&#xff09;开源代码 项目…...

新手入门DetectionLab:10个步骤掌握企业网络安全检测基础

新手入门DetectionLab&#xff1a;10个步骤掌握企业网络安全检测基础 【免费下载链接】DetectionLab clong/DetectionLab: DetectionLab是一个开源项目&#xff0c;旨在建立一个高度可配置的虚拟环境以模拟企业网络&#xff0c;用于检测恶意活动、演练入侵检测系统&#xff08;…...

终极指南:如何为Muzei Live Wallpaper配置GitHub Actions自动化构建与测试

终极指南&#xff1a;如何为Muzei Live Wallpaper配置GitHub Actions自动化构建与测试 【免费下载链接】muzei Muzei Live Wallpaper for Android 项目地址: https://gitcode.com/gh_mirrors/mu/muzei Muzei Live Wallpaper是一款备受欢迎的Android动态壁纸应用&#xf…...

Muzei故障排除大全:20个常见问题及其解决方案的完整列表

Muzei故障排除大全&#xff1a;20个常见问题及其解决方案的完整列表 【免费下载链接】muzei Muzei Live Wallpaper for Android 项目地址: https://gitcode.com/gh_mirrors/mu/muzei Muzei是一款优秀的Android动态壁纸应用&#xff0c;它能为您的手机主屏幕带来每日更新…...

LeetCode 300. Longest Increasing Subsequence 题解

LeetCode 300. Longest Increasing Subsequence 题解 题目描述 给你一个整数数组 nums&#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;…...

openEuler系统下NFS服务器配置实战:多场景权限管理与安全优化

1. NFS服务基础与openEuler环境准备 NFS&#xff08;Network File System&#xff09;是Linux系统中实现文件共享的经典方案&#xff0c;它允许不同主机通过网络访问远程文件系统&#xff0c;就像操作本地文件一样方便。在openEuler这个企业级Linux发行版上配置NFS服务&#xf…...

LeetCode 111. Minimum Depth of Binary Tree 题解

LeetCode 111. Minimum Depth of Binary Tree 题解 题目描述 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输…...

Maestro Studio终极指南:零代码可视化移动应用测试,5分钟上手自动化

Maestro Studio终极指南&#xff1a;零代码可视化移动应用测试&#xff0c;5分钟上手自动化 【免费下载链接】maestro Painless E2E Automation for Mobile and Web 项目地址: https://gitcode.com/GitHub_Trending/ma/maestro 还在为复杂的移动应用测试流程而烦恼吗&am…...

foobox-cn:重塑foobar2000视听体验的智能界面解决方案

foobox-cn&#xff1a;重塑foobar2000视听体验的智能界面解决方案 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你是否曾因音乐播放器界面过于简陋而错失沉浸式的听觉享受&#xff1f;当功能性凌驾…...

终极指南:Google Maps Python客户端错误处理与异常类型完全解析

终极指南&#xff1a;Google Maps Python客户端错误处理与异常类型完全解析 【免费下载链接】google-maps-services-python Python client library for Google Maps API Web Services 项目地址: https://gitcode.com/gh_mirrors/go/google-maps-services-python 在Pytho…...

保姆级教程:用Cadence Sigrity Power DC为海思HI3516A板卡提取电源树(附常见报错处理)

从零掌握Cadence Sigrity Power DC电源树提取&#xff1a;HI3516A实战避坑指南 刚拿到海思HI3516A评估板时&#xff0c;电源网络分析往往是硬件工程师的第一个拦路虎。面对密密麻麻的PCB走线和数十个电源域&#xff0c;传统手动梳理方式不仅耗时费力&#xff0c;还容易遗漏关键…...

Hitboxer终极指南:免费开源SOCD清洁工具让游戏操作更丝滑

Hitboxer终极指南&#xff1a;免费开源SOCD清洁工具让游戏操作更丝滑 【免费下载链接】socd SOCD cleaner tool for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 还在为游戏中的方向冲突而烦恼吗&#xff1f;当你在激烈的对战中同时按下左右方向键&a…...

别怕C++!手把手拆解TinyML测试框架:用micro_test.h给你的嵌入式AI代码加个‘保险丝’

嵌入式AI开发者的测试实战指南&#xff1a;用micro_test.h构建TinyML质量防线 在资源受限的微控制器上开发AI应用时&#xff0c;一个被反复验证的真理是&#xff1a;没有自动化测试的代码就像没有安全网的走钢丝。当你的神经网络模型需要在仅有几KB内存的设备上运行时&#xff…...

终极指南:如何实时监控Slonik连接池状态与性能指标

终极指南&#xff1a;如何实时监控Slonik连接池状态与性能指标 【免费下载链接】slonik A Node.js PostgreSQL client with runtime and build time type safety, and composable SQL. 项目地址: https://gitcode.com/gh_mirrors/sl/slonik Slonik作为一款为Node.js打造…...

3个高效Searchkit高亮技巧:让你的搜索结果直观又专业

3个高效Searchkit高亮技巧&#xff1a;让你的搜索结果直观又专业 【免费下载链接】searchkit Search UI for Elasticsearch & Opensearch. Compatible with Algolias Instantsearch and Autocomplete components. React & Vue support 项目地址: https://gitcode.com…...

鼎捷T100——快速构建简易报表:azzi310与azzi910的高效协作

1. 从零开始&#xff1a;理解鼎捷T100报表开发的核心模块 第一次接触鼎捷T100系统时&#xff0c;我被各种功能模块搞得晕头转向。直到真正用azzi310和azzi910协作完成报表开发&#xff0c;才发现这套组合拳的妙处。简单来说&#xff0c;azzi310就像你的SQL编辑器报表设计器&…...

如何高效处理大规模地图数据:Google Maps Services Python 并发处理终极指南

如何高效处理大规模地图数据&#xff1a;Google Maps Services Python 并发处理终极指南 【免费下载链接】google-maps-services-python Python client library for Google Maps API Web Services 项目地址: https://gitcode.com/gh_mirrors/go/google-maps-services-python …...

CMake构建类型避坑指南:为什么你的Release模式没有优化?CMAKE_BUILD_TYPE常见问题排查

CMake构建类型避坑指南&#xff1a;为什么你的Release模式没有优化&#xff1f; 在C项目开发中&#xff0c;构建类型的选择直接影响最终生成的可执行文件性能。许多开发者在使用CMake时都遇到过这样的困惑&#xff1a;明明设置了CMAKE_BUILD_TYPERelease&#xff0c;但生成的代…...

数据库智能运维:利用PyTorch LSTM预测数据库性能瓶颈

数据库智能运维&#xff1a;利用PyTorch LSTM预测数据库性能瓶颈 1. 引言&#xff1a;当数据库遇上AI预测 凌晨三点&#xff0c;运维工程师小李被刺耳的报警声惊醒——核心数据库又崩溃了。这已经是本月第三次因为性能瓶颈导致的业务中断&#xff0c;每次损失都超过百万。传统…...