opencv 直线拟合

一、拟合原理

opencv自带有最小二乘法拟合直线,但遇到有干扰点的时候,由于最小二乘法是将所有点代入矩阵进行求解,最终误差平方和最小即是最优直线,此时干扰点就会带入误差,效果很差。

随机采样一致算法,它是从一堆含干扰点的数据中,按照筛选条件划分为内点和外点,内点是组成模型的数据,外点是不适合模型的数据。
基本思想和流程如下:

bash 复制代码
1.给定一个数据集***S***,从中选择建立模型所需的最小样本数(空间直线最少可以由两个点确定,所以最小样本数是2,空间平面可以根据不共线三点确定,所以最小样本数为3,拟一个圆时,最小样本数是3),记选择数据集为***S1***
2.使用选择的数据集***S1***计算得到一个数学模型***M1***
3.用计算的模型***M1***去测试数据集中剩余的点,如果测试的数据点在误差允许的范围内,则将该数据点判为内点(inlier),否则判为外点(outlier),记所有内点组成的数据集为***S1****,S1* 称作 ***S1***的一致性集合
4.比较当前模型和之前推出的最好的模型的"内点"的数量,记录最大"内点"数量时模型参数和"内点"数量
5.重复1-4步,直到迭代结束或者当前模型已经足够好了("内点数目大于设定的阈值");每次产生的模型要么因为内点太少而被舍弃,要么因为比现有的模型更好而被选用

以RANSAC直线拟合为例,如下图所示,首先在点集中随机选择两个点,求解它们构成的直线参数,再计算点集中剩余点到该直线的距离,距离小于设置的距离阈值的点为内点,统计内点个数;接下来再随机选取两个点,同样统计内点个数,以此类推;其中内点个数最多的点集即为最大一致集.

此时意味着拟合的直线必然是随机两个点组成的直线,为了拟合精度更高,可以将最大一致集的内殿再使用最小二乘拟合出最终直线。

二、代码实现逻辑

cpp 复制代码
/// <summary>
/// ransac拟合直线
/// </summary>
/// <param name="points">输入点集</param>
/// <param name="line">输出直线方程</param>
/// <param name="iterations">拟合次数</param>
/// <param name="sigma">内点距离阈值</param>
/// <returns></returns>
bool fitLineRansac(const std::vector<cv::Point2f> points, cv::Vec4f& line, int iterations, double sigma)

三、效果

红色为最小二乘结果,绿色为ransac+最小二乘结果

当然,工程上还有一些简单粗暴的方法,按照所有点到拟合直线的距离进行筛选,筛选后再进行拟合。

获取源码请私信

相关推荐
数智工坊1 天前
【DINOv2论文阅读】:无需监督的通用视觉特征提取器——机器人VLA模型的“眼睛“基石
论文阅读·人工智能·深度学习·计算机视觉·transformer
ZPC82101 天前
Open3D 与yolo-3d 那个更适合生成物体3d 包围盒
人工智能·算法·计算机视觉·机器人
yong99901 天前
基于VC++的图像匹配金字塔算法
c++·算法·计算机视觉
Ricky05531 天前
BiFPN-YOLO:一种集成双向特征金字塔网络的一阶段目标检测方法(英国爱尔兰2025年联合研究)
人工智能·计算机视觉·目标跟踪
数智工坊1 天前
【SigLIP论文阅读】:重新定义视觉-语言预训练的损失函数——VLA模型的“语言理解“基石
论文阅读·人工智能·算法·计算机视觉·语言模型
兴通物联科技1 天前
工业手持终端 PDA 键盘化设计与现场作业效率优化 —— 以 XT8001D 为例
大数据·物联网·计算机视觉·计算机外设·硬件架构
深度学习lover1 天前
<数据集>yolo 易拉罐识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·易拉罐识别
断眉的派大星1 天前
两阶段目标检测——RoI Pooling与RoIAlign特征提取详解
人工智能·目标检测·计算机视觉
数智工坊1 天前
【GPT-4V全面评估】:大语言多模态模型的黎明时代
论文阅读·人工智能·深度学习·计算机视觉·transformer
ZPC82101 天前
双目相机 深度图和点云生成物体3D包围盒 生成抓取姿态
人工智能·数码相机·算法·yolo·计算机视觉