如果需要了解其他图像处理的文章,请移步小编的GitHub地址

  传送门:请点击我

  如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice

  VisionPro有很多的示例和算子,这里再展示一个比较好用的算子FitLine Tool。我自己的笔记不会按照顺序一一展示出来的,也许那个文章先OK,我会先release出来的。 其中大部分的图片和步骤都是VisionPro的官方文档,我这里只是自己的学习笔记,不做任何商用。

  在计算机视觉和图像处理领域,直线拟合是一个常见的问题。当我们有一系列的数据点,并希望找到一条最能代表这些数据的直线时,就需要用到直线拟合算法。而VisionPro就有一个非常好用的直线拟合算子FitLineTool。这里我会介绍一下。当然目前已经更新了SmartlineTool,这些后续再说哈。

  首先,我会展示一下FitLine这个算子的页面。其次我会根据这个算子的使用步骤学习一下这个算子的原理。这个算子非常好理解,顾名思义就是直线拟合嘛。肯定是根据我们输入的一系列二维坐标点拟合成一条直线,并将直线在终端输出。(注意至少需要两个坐标点才能拟合直线哈)。下面简单过一下。

1,VisionPro 界面文档

  拟合线编辑控件为 FitLineTool 提供图形用户界面,它接受一组输入点并返回最佳拟合这些输入点的线,同时生成最小的均方根(RMSError)误差。拟合线工具至少需要两个输入点。
  下图是拟合线编辑控件的示例:

有关编辑控件顶部按钮的说明,请参见控件参考主题。拟合圆工具编辑控件支持下列图像缓冲区:
  • Current.InputImage 缓冲区包含当前图像和提供给工具的输入点集。
  • LastRun.InputImage 缓冲区包含工具在将线拟合到输入点集之后的结果。
  有关详细信息,请参见下列主题:

1,设置

  使用设置选项卡以指定要使用的输入点数以及工具可以忽略的点数: 

1.1 输入点

  使用设置选项卡的输入点网格为此拟合线工具指定输入点的数量和 (x,y) 坐标,这至少需要两个输入点。使用下图所示的功能按钮对输入点进行添加、删除和重新排序:

  默认是最少两个点,如果拟合直线,少于两个点会报错(原因很简单,两点确定一条直线嘛)!!!

  下图展示了只输入一个点,FitLineTool的报错情况:

1.2 要忽略的点

  使用要忽略的点数文本框指定拟合线工具在计算最佳拟合线时可以忽略的输入点数。为了确定要忽略的点,“拟合线”工具会考虑所有可能的子集,并保留产生最佳分数的集合。请注意,值越大,工具执行所需的时间就越多。

2,图形

  使用图形选项卡控制拟合线工具生成和显示哪些图形。
  图中右边绿线就是根据我们设置的坐标画出来的线。

  该选项卡提供下列选项:

3,结果

  使用结果选项卡查看每次执行拟合线工具的结果:

  结果选项卡包含以下信息:

  下面三张图是一个结果图,只是输出不能全部一行展开,所以我就截图分开。

2,拟合线的算法原理介绍

2.1  VisionPro FitLineTool 原理

  官网上放的东西,我都一一罗列下来,具体使用了什么,我这里就不再详细分析了,毕竟属于人家商业机密。哈哈哈

  FitLine 工具可用于将直线拟合到一组点。该工具返回拟合所提供的点的线,且RMS误差最小(直线到每个点的距离的平方和的平方根)。

  你可以指定FitLine 工具忽略所提供的部分点。在丢弃允许工具忽略的点数后,工具会尝试使用您提供的点的每个可能组合来拟合线。此工具会丢弃边远点以使用其余点拟合最佳可能的线。

RMS概念

  在数学中,RMS 通常是均方根(Root Mean Square)的缩写。均方根是一种用于衡量一组数值的离散程度或幅度的统计量。
  均方根的计算步骤如下:
  1. 对一组数值进行平方。
  2. 计算平方值的平均值。
  3. 取平均值的平方根。
  数学表示为:如果给定一组数值 x1, x2, ..., xn,均方根(RMS)的公式为:

  其中,\(\sum_{i=1}^{n} x_i^2\) 表示对所有 \(x_i^2\) 进行求和,\(\sqrt{\ldots}\) 表示平方根。
  均方根在信号处理、电工学、物理学等领域经常被用于描述信号的振幅或波动性。在统计学中,均方根也被用于计算方差的平方根,以便得到标准差。 
 

2.2  OpenCV fitline 直线拟合函数

  下图是OpenCV官方文档中,对直线拟合函数的详细介绍,这个可以好好分析,毕竟是开源的哈。

  FitLine算法是一直基于最小二乘法的直线拟合算法。他的基本思想是通过最小化所有点到直线的距离的平方和来估计直线参数。具体来说,我们先假设一条直线的方程为 y=kx+b, 其中k和b是直线的斜率和截距。然后,根据给定的数据点,我们可以构建一个关于k和b的方程组。通过求解这个方程组,我们可以得到直线的参数。FitLine算法的优点是计算速度快,适用于处理大规模数据集。但是,他对噪声和异常值比较敏感,如果数据集中存在较多的噪声或异常值,拟合出的直线可能会偏离真实直线。

  上面很清楚的看到,FitLine函数用于对二维或三维空间中的点集进行直线拟合。共有六个参数(包括输入输出)。

  由下可知,CV_DIST_L2为最简单快速的最小二乘法,推荐使用。官方文档中介绍,这里使用的拟合算法是M-estimator方法

  具体操作,大家根据自己的实际情况使用。

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

  但是当这些点当中有一个或者几个离群点(outlier)时候,最小二乘拟合出来的直线就直接翻车了。原因是最小二乘无法在估算拟合的时候剔除或者降低离群点的影响,于是一个聪明的家伙出现了,提出了基于权重的最小二乘拟合估算方法,这样就避免了翻车。根据高斯分布,离群点权重应该尽可能的小,这样就可以降低它的影响,OpenCV中的直线拟合就是就权重最小二乘完成的,在生成权重时候OpenCV支持几种不同的距离计算方法,分别如上面所描述的。其中DIST_L2是最原始的最小二乘,最容易翻车的一种拟合方式,虽然速度快点。所以VisionPro作为商用算子,肯定考虑了这些因素。具体也在其参数列表里面体现了,可以剔除离群因子。

2.3  RANSAC算法

  除了上面提到的FitLine算法(基于最小二乘法的直线拟合算法),还有RANSAC算法(随机抽样一致算法),这是一种基于随机抽样的算法。他的基本思想是从数据中随机抽取一定数量的点,然后根据这些点来估计模型参数。接着,用该模型来测试所有的数据点,计算每个点到直线的距离,如果距离小于某个阈值,则认为该点是内点。最后,通过迭代这个过程,找到包含最多内点的模型,即为最佳模型。

  RANSAC算法的优点是鲁棒性强,能够处理包含噪声和异常值的数据集。但是,它的计算复杂度较高,需要多次迭代才能找到最佳模型。在实际应用中,我们需要根据具体场景来选择合适的算法。如果数据集包含较多的噪声或异常值,我们可以选择RANSAC算法来提高拟合的鲁棒性;如果数据集规模较大且对计算速度有较高要求,我们可以选择Flitline算法来提高拟合效率。当然,除了这两种算法之外,还有许多其他的直线拟合算法,如霍夫变换、最小中值平方等。在实际应用中,我们可以根据具体需求来选择合适的算法。

RANSAC算法原理

  实际上,RANSAC算法的核心在于将点划分为“内点”和“外点”。在一组包含“外点”的数据集中,采用不断迭代的方法,寻找最优参数模型,不符合最优模型的点,被定义为“外点”。这就是RANSAC的核心思想。

其目标:一个模型与含有野值的数据集S的鲁棒拟合。

算法步骤:

  • 1,随机地从 S 中选择 s 个数据点组成一个样本作为模型的一个例示
  • 2,确定在模型距离阈值 t 内的数据点集 Si, Si称为采样的一致集并定义S的内点
  • 3,如果 Si 的大小(内点的数目)大于某个阈值 T ,用 Si 的所有点重估模型并结束
  • 4,如果 Si 的大小小于 T, 选择一个新的子集并重复上面的过程
  • 5,经过 N 次试验选择最大一致集 Si, 并用 Si 的所有点重估计模型

  

VisionPro学习笔记(7)——FitLineTool的更多相关文章

  1. VisionPro学习笔记(1)——软件介绍和基本使用

    前言 自己使用visionPro已经有段时间了,最近也一直在研究其算子的理论,为了加深印象,计划将自己的学习笔记整理在博客园,当然其官方文档对如何使用及其各种算子都有详细的介绍,所以这里的笔记仅仅为个 ...

  2. Visionpro学习笔记(壹)

    注册4年,第一次发了随笔.我的博客将主要涉及到visionPro软件的学习,labview数据采集方面的思考,c#及VS的学习 此随笔系列主要是关于VisionPro(以后简称VP)的学习及使用. 近 ...

  3. Visionpro学习笔记 :QuickBuild-Based Application Run-Once Button

    1) Creating a Run-Once Button 通过JobManager调用VisionPro文件.所有的过程放到一个Try/Catch块中. Private Sub RunOnceBut ...

  4. VisionPro学习笔记:用IEEE1394相机抓取图像

    1)找到采集卡: CogFrameGrabber1394DCAMs cameras = new CogFrameGrabber1394DCAMs(); 2)列举相连接的相机: ICogFrameGra ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  10. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

随机推荐

  1. 饿了么EMonitor演进史

    简介: 可观测性作为技术体系的核心环节之一,跟随饿了么技术的飞速发展,不断自我革新. 序言 时间回到2008年,还在上海交通大学上学的张旭豪.康嘉等人在上海创办了饿了么,从校园外卖场景出发,饿了么一步 ...

  2. [FAQ] 快速上手 Final Cut Pro X 的入门教程

    FinalCutPro视频剪辑 基本操作教学,看下面的视频作为一个大致了解.另外遇到其它问题再针对性搜索解决即可. > 在线CF靶场 射击消除烦闷 Link:https://www.cnblog ...

  3. github 解决推拉代码提示 REMOTE HOST IDENTIFICATION HAS CHANGED 失败

    本文记录最近 github 推送或拉取代码时提示 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 而失败的解决方法 报错提示如下 @@@@@@@@@@ ...

  4. dotnet C# 在 finally 抛异常会发生什么

    如果我在一个方法的 finally 里面抛出异常,而在 try 里面也抛出,那在上层拿到的是什么 如下面代码 private void F1() { try { A(); } catch (Excep ...

  5. OLAP系列之分析型数据库clickhouse权限控制(六)

    一.clickhouse权限管理 users.xml默认配置文件: <?xml version="1.0"?> <clickhouse> <profi ...

  6. 利用MOS管构成基本的数字逻辑门

    欢迎各位朋友关注"郝旭帅电子设计团队",本微信公众号会定时更新相关技术类资料.软件等等,希望各位朋友都能在本微信公众号获得一些自己想要的"东西". 非门原理图中 ...

  7. 如何通过前后端交互的方式制作Excel报表

    前言 Excel拥有在办公领域最广泛的受众群体,以其强大的数据处理和可视化功能,成了无可替代的工具.它不仅可以呈现数据清晰明了,还能进行数据分析.图表制作和数据透视等操作,为用户提供了全面的数据展示和 ...

  8. C#实现图片转Base64字符串.并支持markdown文件打开展示

    引用1.0.3版本或以上的Wesky.Net.OpenTools 包 1.0.3 版本提供图片转Base64字符串方案,并提供根据后缀名自动识别Mime类型,合成标准URI 开源项目地址: Gitee ...

  9. C数据结构:KMP算法详解(呕心沥血)

    KMP算法 作者心声 了解暴力求解(必需会) KMP算法详解 记住我这段话(你会爱上它的)← : ①前后缀及其用处 ②求出前后缀的next数组 求出next数组的代码 开始实现KMP算法 结尾 附上源 ...

  10. 一文搞懂RESTful开发

    REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描述形式 http: ...