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

三维点拟合平面ransac c++

理论

平面的一般定义
在三维空间中,一个平面可以由两个要素唯一确定:

法向量 n=(a,b,c):垂直于平面的方向

平面上一点

平面上任意一点 p=(x,y,z) 满足:
( p − p 0 ) ∗ n = 0 (p - p0) * n = 0 (pp0)n=0 a ( x − x 0 ) + b ( y − y 0 ) + c ( z − z 0 ) + d = 0 a(x - x0) + b(y-y0) + c(z - z0) + d = 0 a(xx0)+b(yy0)+c(zz0)+d=0

Step 1:从 3 点拟合平面
设 3 个点为 p1, p2, p3

计算平面上的一点和法向量:
v 1 = p 2 − p 1 v 2 = p 3 − p 1 n = v 1 x v 2 v1 = p2 -p1\\ v2 = p3 - p1 \\ n = v1 x v2 v1=p2p1v2=p3p1n=v1xv2

平面点
p0 = p1
平面方程:
( p − p 0 ) ∗ n = 0 (p - p0) * n = 0 (pp0)n=0

Step 2:点到平面的距离
对于任意点 pi ,其到平面距离为:

d i = ∣ ( p i − p 0 ) ∗ n ∣ ∣ ∣ n ∣ ∣ d_i = \frac{| (p_i - p0) * n | }{|| n || } di=∣∣n∣∣(pip0)n

或者直接转为标准平面方程 ax+by+cz+d=0 形式:
d i = ∣ a x i + b y i + c z i + d ∣ a 2 + b 2 + c 2 d_i = \frac{| ax_i + by_i+cz_i + d | }{\sqrt{a^2 + b^2 + c^2}} di=a2+b2+c2 axi+byi+czi+d

Step 3:判断 inlier
设阈值 ,统计内点个数

Code

//三维点拟合平面
void testransac3DPlane(std::vector<Eigen::Vector3d> point3ds, int iterator, int& bestliner, Eigen::Vector3d& bestn, Eigen::Vector3d& bestp0) {std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, point3ds.size() - 1);bestliner = 0;double thdis = 10.;for (int i = 0; i < iterator; i++) {int id1 = dis(gen);int id2 = dis(gen);int id3 = dis(gen);if (id1 == id2 || id1 == id3 || id2 == id3)continue;Eigen::Vector3d point1 = point3ds[id1];Eigen::Vector3d point2 = point3ds[id2];Eigen::Vector3d point3 = point3ds[id3];//法向量Eigen::Vector3d v1 = point2 - point1;Eigen::Vector3d v2 = point3 - point1;Eigen::Vector3d n = v1.cross(v2).normalized();int liner = 0;for (auto& point : point3ds) {//计算距离Eigen::Vector3d newpoint = point - point1;double dist = abs(newpoint.dot(n)) / n.norm();if (dist < thdis) {liner;}}if (liner > bestliner) {bestliner = liner;bestn = n;bestp0 = point1;}}
}

相关文章:

  • MCP 协议:AI 世界的 “USB-C 接口”,开启智能交互新时代
  • 管家婆财贸ERP BB095.销售单草稿自动填充组合品明细
  • Python 的 pip 命令详解,涵盖常用操作和高级用法
  • Vue 3.0 Composition API 与 Vue 2.x Options API 的区别
  • (论文阅读)RNNoise 基于递归神经网络的噪声抑制库
  • 频率合成方法及其实现原理
  • 嵌入式linux架构理解(宏观理解)6ull学习心得---从架构理解到自写程序运行及自写程序开机自启动
  • 几个常用的快速处理服务器命令和故障排查
  • 每天学一个 Linux 命令(20):find
  • MySQL Limit 分页查询性能问题及优化方案
  • 配电监控DLT645电表数据 转EthernetIP项目案例
  • 2024年RIS SCI2区:自适应天鹰算法AAO,深度解析+性能实测
  • 如何开一个线上故障复盘会
  • DeepSeek 部署中的常见问题及解决方案
  • Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(五)
  • 图扑低代码数字孪生平台,搭建工业组态大屏
  • 2025年第十六届蓝桥杯Python程序设计赛道B组
  • 科技如何改变世界?
  • 人工智能在后端开发中的革命:从架构到运维
  • C++ 常用的智能指针
  • 解除近70家煤电厂有毒物质排放限制,特朗普能重振煤炭吗?
  • 山东临沂市市长张宝亮履新市委书记
  • 广西东兰官方通报“村民求雨耕种”:摆拍,恶意炒作
  • 马上评丨“化学麻将”创新值得点赞,但要慎言推广
  • 马克龙:美乌欧在法磋商乌克兰问题“积极且有建设性”
  • 董军与越南国防部长共同主持中越边境国防友好交流活动