当前位置: 首页 > 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
  • 经营业绩持续稳中向好,国铁集团2024年度和2025年一季度财务决算公布
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 临港迎来鸿蒙智行“尚界”整车及电池配套项目,首款车型今秋上市
  • 【社论】人工智能,年轻的事业
  • 长三角议事厅·周报|长三角游戏出海,关键在“生态输出”
  • 宁波银行一季度净利74.17亿元增5.76%,不良率持平