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

三维点拟合直线ransac c++

理论

直线公式:
l ( t ) = p 0 + t ∗ d l(t) = p0 + t *d l(t)=p0+td
其中

  • p0 : 直线上的某点,通过两个点确定
  • d : 方向向量(归一化)

RANSAC 拟合步骤(3D)
随机选两个不同点
𝑝1,𝑝2
计算方向向量
d = p 2 − p 1 d = p2 - p1 d=p2p1
遍历所有点,计算它们到直线的距离:

d i = ∣ ∣ ( p i − p 1 ) x d ∣ ∣ ∣ ∣ d ∣ ∣ d_i = \frac{|| (p_i - p1) x d||}{||d||} di=∣∣d∣∣∣∣(pip1)xd∣∣
判断哪些点为内点(距离小于阈值)

重复若干次,保存内点最多的模型

Code

//point3ds输入 iterations迭代次数 bestliner输出最佳的点数,bestdir  bestp0直线的参数
void testransac3D(std::vector<Eigen::Vector3d> point3ds,int iterator, int& bestliner, Eigen::Vector3d& bestdir, 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);if (id1 == id2)continue;Eigen::Vector3d point1 = point3ds[id1];Eigen::Vector3d point2 = point3ds[id2];//方向向量Eigen::Vector3d dir = (point2 - point1).normalized();int liner = 0;for (auto& point : point3ds) {//计算距离Eigen::Vector3d newpoint = point - point1;double dist = (newpoint.cross(dir)).norm() / dir.norm();if (dist < thdis) {liner;}}if (liner > bestliner) {bestliner = liner;bestdir = dir;bestp0 = point1;}}
}

相关文章:

  • C/C++中获取或处理时间节点方法
  • UWP特性分析
  • 软件招标评审模板
  • OpenCV day6
  • 责任链模式:从 Sentinel 流控到审批流程的链式处理
  • 什么是Netty
  • 常见免杀框架的使用(3款)---【AniYaGUI1.2.0、AV_Evasion_Tool掩日、FoxBypass_V1.0】
  • IHC肿瘤标志物 | 常见前列腺癌诊断
  • RAG-分块策略
  • 项目实战--新闻分类
  • 如何从EndNote中将某一篇手稿里面涉及到的引用文献导出,导出格式为bib?
  • 北京SMT贴片厂精密制造关键工艺
  • ESP-IDF教程2 GPIO - 输入、输出和中断
  • 【C++】 —— 笔试刷题day_19
  • STM32 HAL 通用定时器延时函数
  • 观察者 ➜ 事件总线:一路走来的碎碎念
  • 贪心、动态规划、其它算法基本原理和步骤
  • 00.IDEA 插件推荐清单(2025)
  • fastdds:传输层SHM和DATA-SHARING的区别
  • java输出HelloWorld
  • 具身智能资本盛宴:3个月37笔融资,北上深争锋BAT下场,人形机器人最火
  • 电商平台全面取消“仅退款”:电商反内卷一大步,行业回归良性竞争
  • 18条举措!上海国际金融中心进一步提升跨境金融服务便利化
  • 对话地铁读书人|翻译Esther:先读原著,再看电影
  • 1672万!大乐透8.8亿派奖第4期松江彩民18元中头奖
  • 纪念沈渭滨︱初五沈大大  浓浓师生情