C++ opencv拟合直线

cpp 复制代码
// 拟合直线
            cv::Vec4f line;
            cv::fitLine(points, line, cv::DIST_L2, 0, 0.01, 0.01);
            result.line = line;
            result.valid = true;
cpp 复制代码
void cv::fitLine(
    InputArray points,       // 输入:待拟合的点集
    OutputArray line,        // 输出:拟合出的直线参数
    int distType,            // 距离度量方法(如何计算点到直线的距离)
    double param,            // 距离度量的附加参数(多数情况用0)
    double reps,             // 坐标精度(迭代收敛阈值)
    double aeps              // 方向向量精度(迭代收敛阈值)
);

核心功能:根据输入的点集 points,计算出一条 "最优直线",使得所有点到该直线的 "距离和" 最小,并将直线参数存入 line 中。

  1. points(输入点集)
    类型:vectorcv::Point 或 vectorcv::Point2f(离散点的集合,如从图像中提取的边缘点、轮廓点)。
    作用:函数基于这些点的分布拟合直线,点集数量需 ≥2(至少 2 个点才能确定一条直线)。

  2. line(输出直线参数)
    类型:cv::Vec4f(包含 4 个浮点数的向量,格式为 (vx, vy, x0, y0))。
    具体含义:
    vx, vy:直线的方向向量(单位向量,长度为 1),反映直线的走向(例如 vx=1, vy=0 表示水平向右);
    x0, y0:直线上的一个点的坐标(即直线经过 (x0, y0) 这个点)。
    后续使用:有了 (vx, vy, x0, y0),就可以唯一确定一条直线(比如你之前用这 4 个值计算直线端点并绘制直线)。

  3. cv::DIST_L2(距离度量方法)
    这是拟合直线的核心参数,决定了 "如何计算点到直线的距离" 以及 "如何最小化总距离"。cv::DIST_L2 表示使用欧氏距离(最常用的距离度量):
    点 (x,y) 到直线的欧氏距离公式:
    d=
    v
    x
    2

    +v
    y
    2

∣(y

0

−y)⋅v

x

−(x

0

−x)⋅v

y

(因 vx, vy 是单位向量,分母为 1,简化为分子的绝对值)。

函数会最小化所有点到直线的欧氏距离的平方和(即最小二乘法拟合),适用于点集无明显离群点的场景。

其他常用距离度量(可选):

cv::DIST_L1:曼哈顿距离(对离群点更鲁棒,拟合结果受极端值影响小);

cv::DIST_HUBER:Huber 距离(结合 L1 和 L2 的优点,平衡鲁棒性和精度)。

  1. 0(距离度量的附加参数 param)

作用:仅对部分距离度量(如 DIST_L1、DIST_HUBER)有效,用于调整距离计算的权重。

对于 cv::DIST_L2(欧氏距离),此参数无效,固定填 0 即可。

  1. 0.01, 0.01(迭代精度 reps 和 aeps)

cv::fitLine 是通过迭代计算找到最优直线的,这两个参数控制迭代的 "收敛条件":

reps:坐标精度(单位:像素)。当迭代过程中直线上点 (x0, y0) 的变化量小于 0.01 像素时,认为坐标收敛;

aeps:方向向量精度。当方向向量 (vx, vy) 的变化量小于 0.01 时,认为方向收敛。

意义:数值越小,拟合精度越高,但迭代次数越多(计算时间越长);实际使用中 0.01 是兼顾精度和效率的常用值。

相关推荐
彧azz1 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
hansang_IR2 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
嵌入式学习菌2 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
ChampaignWolf2 小时前
在 SAP S/4HANA 内部基于 ICF Handler 从零实现 ABAP MCP Server:架构、代码与踩坑实录
c++·架构·sap·abap·mcp
matlab代码3 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
matlab代码3 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk5553 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080163 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
尘客-追梦4 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
持敬chijing4 小时前
Python-数据类型-列表
开发语言·python·青少年编程