OpenCV中直线拟合方法解密

OpenCV学堂 2025-04-28 22:26
图片

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

直线拟合原理

给出多个点,然后根据这些点拟合出一条直线,这个最常见的算法是多约束方程的最小二乘拟合,如下图所示:

图片

但是当这些点当中有一个或者几个离群点(outlier)时候,最小二乘拟合出来的直线就直接翻车成这样了:

图片

原因是最小二乘无法在估算拟合的时候剔除或者降低离群点的影响,于是一个聪明的家伙出现了,提出了基于权重的最小二乘拟合估算方法,这样就避免了翻车。根据高斯分布,离群点权重应该尽可能的小,这样就可以降低它的影响,OpenCV中的直线拟合就是就权重最小二乘完成的,在生成权重时候OpenCV支持几种不同的距离计算方法,分别如下:

图片

其中DIST_L2是最原始的最小二乘,最容易翻车的一种拟合方式,虽然速度快点。然后用基于权重的最小二乘估算拟合结果如下:

图片

函数与实现源码分析

OpenCV中直线拟合函数支持上述六种距离计算方式,函数与参数解释如下:

voidcv::fitLine(InputArraypoints,OutputArrayline,intdistType,doubleparam,doublereps,doubleaeps)
  • points是输入点集合

  • line是输出的拟合参数,支持2D与3D

  • distType是选择距离计算方式

  • param 是某些距离计算时生成权重需要的参数

  • reps 是前后两次原点到直线的距离差值,可以看成拟合精度高低

  • aeps是前后两次角度差值,表示的是拟合精度

六种权重的计算更新实现如下:

static void weightL1float *d, int count, float *w )
{
    int i;


    for( i = 0; i < count; i++ )
    {
        double t = fabs( (double) d[i] );
        w[i] = (float)(1. / MAX(t, eps));
    }
}


static void weightL12float *d, int count, float *w )
{
    int i;


    for( i = 0; i < count; i++ )
    {
        w[i] = 1.0f / (floatstd::sqrt1 + (double) (d[i] * d[i] * 0.5) );
    }
}




static void weightHuberfloat *d, int count, float *w, float _c )
{
    int i;
    constfloat c = _c <= 0 ? 1.345f : _c;


    for( i = 0; i < count; i++ )
    {
        if( d[i] < c )
            w[i] = 1.0f;
        else
            w[i] = c/d[i];
    }
}




static void weightFairfloat *d, int count, float *w, float _c )
{
    int i;
    constfloat c = _c == 0 ? 1 / 1.3998f : 1 / _c;


    for( i = 0; i < count; i++ )
    {
        w[i] = 1 / (1 + d[i] * c);
    }
}


static void weightWelschfloat *d, int count, float *w, float _c )
{
    int i;
    constfloat c = _c == 0 ? 1 / 2.9846f : 1 / _c;


    for( i = 0; i < count; i++ )
    {
        w[i] = (floatstd::exp( -d[i] * d[i] * c * c );
    }
}


拟合计算的代码实现:

static void fitLine2D_wods( const Point2f* points, int count, float *weights, float *line )
{
    CV_Assert(count > 0);
    double x = 0, y = 0, x2 = 0, y2 = 0, xy = 0, w = 0;
    double dx2, dy2, dxy;
    int i;
    float t;

    // Calculating the average of x and y...
    if( weights == 0 )
    {
        for( i = 0; i counti += 1 )
        {
            x += points[i].x;
            y += points[i].y;
            x2 += points[i].x * points[i].x;
            y2 += points[i].y * points[i].y;
            xy += points[i].x * points[i].y;
        }
        w = (float)count;
    }
    else
    {
        fori = 0;i < counti += 1 )
        {
            x += weights[i] * points[i].x;
            y += weights[i] * points[i].y;
            x2 += weights[i] * points[i].x * points[i].x;
            y2 += weights[i] * points[i].y * points[i].y;
            xy += weights[i] * points[i].x * points[i].y;
            w += weights[i];
        }
    }

    x /= w;
    y /= w;
    x2 /= w;
    y2 /= w;
    xy /= w;

    dx2 = x2-x * x;
    dy2 = y2-y * y;
    dxy = xy-x * y;

    t = (float)atan22 * dxydx2-dy2 ) / 2;
    line[0] = (float)cost );
    line[1] = (float)sint );

    line[2] = (float)x;
    line[3] = (float)y;
}


案例:直线拟合

有如下的原图:

图片

通过OpenCV的距离变换,骨架提取,然后再直线拟合,使用DIST_L1得到的结果如下:

图片



OpenCV-C++/Python视频教程30课时,请看B站:


https://www.bilibili.com/video/BV1hM4y1M7vQ (python版本)https://www.bilibili.com/video/BV1i54y1m7tw (C++版本)


OpenCV4系统化学习
图片

深度学习系统化学习
图片

推荐阅读

OpenCV4.8+YOLOv8对象检测C++推理演示

ZXING+OpenCV打造开源条码检测应用

总结 | OpenCV4 Mat操作全接触

三行代码实现 TensorRT8.6 C++ 深度学习模型部署

实战 | YOLOv8+OpenCV 实现DM码定位检测与解析

对象检测边界框损失 – 从IOU到ProbIOU

YOLOv8 OBB实现自定义旋转对象检测

初学者必看 | 学习深度学习的五个误区

YOLOv8自定义数据集训练实现安全帽检测



图片

OpenCV学堂 专注计算机视觉开发技术分享,技术框架使用,包括OpenCV,Tensorflow,Pytorch教程与案例,相关算法详解,最新CV方向论文,硬核代码干货与代码案例详解!作者在CV工程化方面深度耕耘15年,感谢您的关注!
评论
  • 电磁场是自然界中一种特殊的物质存在形式,由相互依存且能够相互转化的电场和磁场共同构成。这种无形的物理场充满整个空间,既能够传递电磁力,也能够以电磁波的形式传播能量。电场源于静止或运动的电荷,表现为对带电粒子施加作用力的能力;而磁场则产生于电流或变化的电场,能够影响运动电荷的轨迹。两者通过动态耦合形成统一的电磁场系统,其行为规律由麦克斯韦方程组完整描述。这个方程组包含四个基本方程,分别揭示了电荷如何产生电场、磁场无孤立磁荷的特性、变化磁场激发电场的规律,以及电流与变化电场共同产生磁场的机制。电磁场
    锦正茂科技 2025-05-19 13:07 15浏览
  • 电磁场的作用主要体现在以下几个方面:首先在能源领域,电磁场是发电、输电的基础。无论是火力发电还是核电站,*终都需要通过电磁感应原理将机械能转化为电能。高压输电线路则利用交变电磁场实现电能的远距离传输,为现代工业和生活提供动力保障。在通信技术方面,电磁波作为电磁场的传播形式,构成了无线通信的基础。从无线电广播到5G移动网络,从卫星通信到光纤传输,本质上都是对特定频段电磁场的**控制和利用。雷达系统通过发射和接收电磁波实现目标探测,在气象预报、航空管制等领域不可huo缺。在医疗领域,电磁场技术为诊断
    锦正茂科技 2025-05-19 13:19 14浏览
  • 什么是信号量信号量能干啥信号量的函数实例举例总结什么是信号量简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。信号量能干啥资源管理:控制多个任务对共享资源(如外设、内存块)的访问权限,避免竞争条件任务同步 :实现任务间的时序协调(如等待某个事件完成)中断与任务通信:在中断服务程序(ISR)中快速通知任务处理事件(需使用 xxxFromISR 版本的函数)信号量的函数创建二进制信号量函数原型
    二月半 2025-05-18 20:48 95浏览
  • ETC系统是一种高速公路或桥梁自动收费系统。插卡式ETC是长这个样子的,正面如下图。背面是有一小块太阳能板的,还有一个按钮开关,如下图。用工具拆开上盖,可以看见电池,显示屏,卡片,如下图。取下PCB板,可以看见背面,如下图。J5,J6脚是接太阳能板的正负极的,SKYRELAY(斯凯瑞利) SKY1311T 读卡器芯片,内部集成了多种通信协议。SKY1311T芯片通过内置的硬件加密引擎和高级加密标准(AES)来实现数据的加密传输,保证数据的安全性。169E 具体的数据手册没有查到,猜测是
    liweicheng 2025-05-17 21:41 90浏览
  • 【拆解】+TFT LCD 通用测试仪拆解 目前对于车载行业,显示屏在整车的份额越来越高。各个供应商或者下级供应商都会回针对TFT的开发做规划。那么,在TFT测试方面,他们是如何进行产品开发前的测试和有效性验证的内。是的,无非就是他们公司自己开发点亮治具或者从治具供应商那边购买点亮设备。客户只需要提供客户需求。有能力的供应商就好针对需求进行分解开发。在规定的时间内完成产品的开发和交付。今天我们就来看看用在车载显示屏或者消费电子上面的TFT点亮治具—TFT LCD通用测试仪式怎么设计出来的。 如下就
    zhusx123 2025-05-18 14:07 81浏览
  •   头部技术企业核心能力与行业解决方案解析   华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司   五木恒润科技有限公司:是一家专业的部队信息化建设服务单位
    华盛恒辉l58ll334744 2025-05-19 17:18 82浏览
  • 在现代影像技术的快速发展下,动态范围(Dynamic Range)成为评估影像质量的重要指针之一。无论是无人机在高空拍摄的画面、工作用相机在不同光线条件下的成像表现、还是随身记录仪在运动过程中的稳定录像,「动态范围」的数值高低直接影响画面的清晰度与细节还原能力。然而,拍摄环境中的极端条件,如耀眼的阳光、深沉的阴影或快速变化的光线,都对产品的影像拍摄提出了严峻的挑战。技术难题:不同环境下对影像设备的质量影响本次分享一家网络监控摄影机(Network Cameras) 制造厂商,经常收到客诉提到:在
    百佳泰测试实验室 2025-05-16 14:43 191浏览
  • 什么是互斥量互斥量的应用场合互斥量的API函数基本代码结构互斥量使用举例递归锁递归锁举例总结什么是互斥量在freeRTOS中,多个任务访问一块共享资源,会产生竞争现象。比如马路上只有一个很早以前的电话亭,A、B都想要打电话,然后他们就开始打架了。但是如果A先进去了然后把门锁了,B想进去打电话的话只能在外面等,必须等到A把门锁打开。互斥量的应用场合像freeRTOS的多任务系统,任务A正在使用某个资源,还没用完的时候,任务B也来使用,就可能会导致问题。就比如串口,任务A正在用串口发送数据,此时任务
    二月半 2025-05-18 20:54 89浏览
  • 随着智能硬件设备的快速发展,蓝牙音频语音芯片在智能家居、穿戴设备、车载电子等领域得到广泛应用。蓝牙音频语音芯片凭借其低功耗、高集成度和灵活的通信接口,成为许多开发者的选择。然而,在实际应用中,开发者可能会遇到IC芯片通过串口或MCU通信时无响应的问题。本文将从通信接口配置与故障排查角度,普及相关知识并提供解决方案。一、通信接口基础配置串口接线规则蓝牙芯片的串口通信需遵循“交叉连接”原则:TX(发送端)→ RX(接收端)RX(接收端)→ TX(发送端)若接线错误(如TX-TX或RX-RX直连),数
    广州唯创电子 2025-05-19 09:47 12浏览
  •   全球仿真软件头部企业核心实力与行业地位解析   仿真软件行业的竞争格局随技术迭代和市场需求动态演变,以下从技术优势、行业应用等维度,梳理全球范围内具备标杆意义的企业:   1. 华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP
    华盛恒辉l58ll334744 2025-05-16 11:37 153浏览
  • 非常荣欣参加了这次《7天造一台无人机》试读体验活动,同时非常感谢面包板论坛举办此活动。本书印刷还是非常新颖,具有精美漫画。下图为图书正面。 本书主要介绍组装、调试一架四旋翼无人机的完整流程,包括组装无人机机架、安装电机和螺旋桨、电池充电保养、安装飞控、飞行前调试,并且在组装、调试过程中依次介绍了飞行原理、动力系统、遥控器、电池、飞控等相关基础知识。 本书共分为7章。第1章首先介绍了无人机学习的一些方法,避免大家在学习无人机时走弯路;然后介绍了无人机的基础知识,并对四旋翼无人机的概念、飞行原理和各
    shenwen2007_656583087 2025-05-17 12:07 60浏览
  • 2025 年 5 月 16 日讯,英伟达首席执行官黄仁勋的专机于北京时间 13:29 抵达中国台北松山机场,其此行引起了广泛关注。黄仁勋此番赴台,主要是为了参加即将于 5 月 20 日至 23 日举行的台北电脑展(Computex 2025),他将在 19 日上午进行主题演讲。此次演讲备受期待,市场猜测其可能会宣布英伟达与富士康、广达等中国台湾地区 AI 服务器公司达成的更多合作,进一步推动 AI 技术的发展和应用。此外,据市场消息,黄仁勋将于 17 日邀请供应链伙伴聚餐,鸿海董事长刘扬伟、纬创
    鲜橙财经 2025-05-16 14:00 209浏览
  •   北京仿真软件开发代表性企业解析   北京作为国内仿真技术创新高地,集聚多家深耕细分领域的领先企业,其技术布局与行业适配性各具特色。以下为核心企业的优势解析及选型参考:   一、华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,
    华盛恒辉l58ll334744 2025-05-16 16:00 180浏览
  • 这算是一款挺经典的“轨迹球”,它与其它品牌轨迹球最大的不同是它有个大圆环形状的滚轮,缩放图片、浏览网页非常方便,据说这还是Kensington独有的专利。我要拆解的这款轨迹球的型号是:K72337,算是同品牌系列里最最基础的入门款,优点是价廉物美(人民币200元左右),缺点是球的直径略小(40mm)—— 要想精准定位光标位置需要先有操控它的娴熟度,还有就是这款可供组合的按键也太少(高配型号有多个自定义按键),但好在我当年入手它就只是为了提高工作效率(用于文字编辑、程序修改、PPT绘图、音频剪辑等
    牛言喵语 2025-05-18 05:42 73浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦