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

二维点拟合直线ransac c++

需求 : 用C++实现一堆离散的二维点拟合出来一条直线

理论

直线公式:
a x + b y + c = 0 ax+by+c=0 ax+by+c=0

  1. 随机选两个点,构造一般式直线:
    a x + b y + c = 0 ax+by+c=0 ax+by+c=0

方向向量:
d = ( x 2 − x 1 , y 2 − y 1 ) d = (x2-x1,y2-y1) d=(x2x1,y2y1)
法向量:
n = ( − d y , d x ) n = (-d_y,d_x) n=(dy,dx)

在直线的“一般式方程”中:
ax+by+c=0
这个 (a,b) 实际上就是直线的法向量

也就是
a = y 2 − y 1 b = x 2 − x 1 c = − a x 1 − b y 1 a = y2-y1 \\ b= x2-x1\\c = -ax1-by1 a=y2y1b=x2x1c=ax1by1

  1. 计算所有点到直线的距离:

d i = ∣ a x i + b y i + c ∣ a 2 + b 2 d_i = \frac{|ax_i + by_i + c|}{\sqrt{a^2+b^2}} di=a2+b2 axi+byi+c

  1. 判断是否为内点(小于阈值)

  2. 重复若干次,选出包含最多内点的模型

若:

s 是一次采样所需点数(拟合直线是 2)
p 是样本中内点的比例
k 是需要的置信度(如 0.99)
则最少采样次数
N 应满足:

1 − ( 1 − p s ) N > = k = = > N > = l o g ( 1 − k ) 1 − P s 1 - ( 1 - p^{s} ) ^N >= k ==> N>= \frac{log(1-k)}{1-P^s} 1(1ps)N>=k==>N>=1Pslog(1k)

这可以根据实际数据调整迭代次数。

Code

//point2ds输入 iterations迭代次数 bestliner输出最佳的点数,besta,bestb,bestc 直线的参数
void testransac2D(std::vector<Eigen::Vector2d> point2ds, int iterations, int& bestliner, int& besta, int& bestb, int& bestc) {//生成随机数std::random_device rand;std::mt19937 gen(rand());std::uniform_int_distribution<> distribution(0, point2ds.size() - 1);for (int i = 0; i < iterations; i++) {int id1 = distribution(gen);int id2 = distribution(gen);if (id1 == id2) continue;Eigen::Vector2d point1 = point2ds[id1];Eigen::Vector2d point2 = point2ds[id2];//计算直线int a = point1.y() - point2.y();int b = point1.x() - point2.y();int c = -a * point1.x() - b * point1.y();double thr = 10.;int liner = 0;//计算直线距离 算出内点数量最多的那个for (auto& point : point2ds) {double dis = abs(a * point.x() + b * point.y() + c) / sqrt(a * a + b * b);if (dis < thr) {liner++;}}if (liner > bestliner) {bestliner = liner;besta = a;bestb = b;bestc = c;}}
}

相关文章:

  • 2.1 SQL server的安装以及一个数据表的创建
  • 博客系统案例练习-回顾
  • 如何精通C++编程?
  • 在日本做IT,浅谈Android的现状与前景
  • ollama安装到自定义为止
  • 阀门轴承电动车工件一键精修软件
  • 简易 Python 爬虫实现,10min可完成带效果源码
  • Tokenizer的细节计算方式及优缺点分析
  • 16862A 68 通道便携式逻辑分析仪
  • RocketMQ 的详细使用教程
  • MySQL启动Failed to start LSB: start and stop MySQL
  • JAVA 异常+File
  • 分享4-5月工信部排考计划
  • Altium Designer安装教程
  • LeetCode19.删除链表的倒数第N个节点
  • __call__ 方法
  • 文章记单词 | 第38篇(六级)
  • 《GPT-4.1深度解析:AI进化新标杆,如何重塑行业未来?》
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析
  • [python]@staticmethod
  • 能源央企资产重组大提速,专业化整合掀起新热潮
  • 龚桢梽任广东省发展和改革委员会副主任
  • 一季度全国铁路发送旅客10.74亿人次,创同期历史新高
  • 山东白羽鸡龙头凤祥股份拟私有化退市
  • 岳阳一安置房天花板被指用手能抠出洞,住建局已带第三方机构去检测
  • 美国智库预计今年美经济增长或陷入停滞