VisionPro学习笔记(7)——FitLineTool
如果需要了解其他图像处理的文章,请移步小编的GitHub地址
传送门:请点击我
如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice
VisionPro有很多的示例和算子,这里再展示一个比较好用的算子FitLine Tool。我自己的笔记不会按照顺序一一展示出来的,也许那个文章先OK,我会先release出来的。 其中大部分的图片和步骤都是VisionPro的官方文档,我这里只是自己的学习笔记,不做任何商用。
在计算机视觉和图像处理领域,直线拟合是一个常见的问题。当我们有一系列的数据点,并希望找到一条最能代表这些数据的直线时,就需要用到直线拟合算法。而VisionPro就有一个非常好用的直线拟合算子FitLineTool。这里我会介绍一下。当然目前已经更新了SmartlineTool,这些后续再说哈。
首先,我会展示一下FitLine这个算子的页面。其次我会根据这个算子的使用步骤学习一下这个算子的原理。这个算子非常好理解,顾名思义就是直线拟合嘛。肯定是根据我们输入的一系列二维坐标点拟合成一条直线,并将直线在终端输出。(注意至少需要两个坐标点才能拟合直线哈)。下面简单过一下。
1,VisionPro 界面文档

- Current.InputImage 缓冲区包含当前图像和提供给工具的输入点集。
- LastRun.InputImage 缓冲区包含工具在将线拟合到输入点集之后的结果。
1,设置

1.1 输入点

默认是最少两个点,如果拟合直线,少于两个点会报错(原因很简单,两点确定一条直线嘛)!!!
下图展示了只输入一个点,FitLineTool的报错情况:

1.2 要忽略的点
2,图形

该选项卡提供下列选项:

3,结果


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



2,拟合线的算法原理介绍
2.1 VisionPro FitLineTool 原理
官网上放的东西,我都一一罗列下来,具体使用了什么,我这里就不再详细分析了,毕竟属于人家商业机密。哈哈哈

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

RMS概念
- 对一组数值进行平方。
- 计算平方值的平均值。
- 取平均值的平方根。

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的更多相关文章
- VisionPro学习笔记(1)——软件介绍和基本使用
前言 自己使用visionPro已经有段时间了,最近也一直在研究其算子的理论,为了加深印象,计划将自己的学习笔记整理在博客园,当然其官方文档对如何使用及其各种算子都有详细的介绍,所以这里的笔记仅仅为个 ...
- Visionpro学习笔记(壹)
注册4年,第一次发了随笔.我的博客将主要涉及到visionPro软件的学习,labview数据采集方面的思考,c#及VS的学习 此随笔系列主要是关于VisionPro(以后简称VP)的学习及使用. 近 ...
- Visionpro学习笔记 :QuickBuild-Based Application Run-Once Button
1) Creating a Run-Once Button 通过JobManager调用VisionPro文件.所有的过程放到一个Try/Catch块中. Private Sub RunOnceBut ...
- VisionPro学习笔记:用IEEE1394相机抓取图像
1)找到采集卡: CogFrameGrabber1394DCAMs cameras = new CogFrameGrabber1394DCAMs(); 2)列举相连接的相机: ICogFrameGra ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
随机推荐
- mockjs 模拟实现增删改查
/*mUtils.js用于解析get请求的参数*/ export const param2Obj = url => { const search = url.split('?')[1] if ( ...
- 搭建Hadoop环境
搭建Hadoop环境 一.虚拟机的安装 二. 安装JDK 1.下载jdk wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41- ...
- 深度|为什么一定要从DevOps走向BizDevOps?
简介: 为更好地厘清波涛汹涌的数字化转型浪潮下软件产业所面对的机遇与挑战,6月29日,阿里云云效与阿里云开发者评测局栏目,联合特邀了InfoQ极客帮副总裁付晓岩.南京大学软件工程学院教授张贺.Thou ...
- CNCF 沙箱项目 OCM Placement 多集群调度指南
简介:在这篇文章中,将介绍 Placement 如何选择到所需的集群,Placement 可以提供的调度功能,以及一些场景下的最佳实践,使用者可以参考示例来编写符合自己要求的 Placement.其 ...
- EventBridge 与 FC 一站式深度集成解析
简介:本篇文章通过对 EventBridge 与 FC 一站式深度集成解析和集成场景的介绍,旨在帮助大家更好的了解面对丰富的事件时,如何使用 EventBridge 与 FC 的一站式集成方案,快速 ...
- Serverless Kubernetes:理想,现实与未来
简介: 当前 Serverless 容器的行业趋势如何?有哪些应用价值?如果 Kubernetes 天生长在云上,它的架构应该如何设计?Serverless 容器需要哪些基础设施?阿里云容器服务产品负 ...
- Flink 和 Iceberg 如何解决数据入湖面临的挑战
简介: 4.17 上海站 Meetup 胡争老师分享内容:数据入湖的挑战有哪些,以及如何用 Flink + Iceberg 解决此类问题. 一.数据入湖的核心挑战 数据实时入湖可以分成三个部分,分别是 ...
- MaxCompute执行引擎核心技术DAG揭秘
简介: 作为业界少有的EB级数据分布式平台,MaxCompute每天支撑上千万个分布式作业的运行.这些作业特点各异,既有包含数十万计算节点的超大型作业,也有中小规模的分布式作业.不同用户对于不同规模 ...
- [FAQ] Golang error strings should not be capitalized or end with punctuation
当我们在 Golang 中使用 errors.New("Aaa.") 形式返回 error 信息时,文字内容不应该以大写字母开头或者标点符号结尾. 所以这样是可以的 errors. ...
- 扎克伯格说,Llama3-8B还是太大了,量化、剪枝、蒸馏准备上!
扎克伯格说,Llama3-8B还是太大了,不适合放到手机中,有什么办法? 量化.剪枝.蒸馏,如果你经常关注大语言模型,一定会看到这几个词,单看这几个字,我们很难理解它们都干了些什么,但是这几个词对于现 ...