二维直线拟合--opencv实现

article/2025/11/8 4:54:08

二维/三维直线拟合–opencv实现

​ Hough变换可以提取图像中的直线,但是提取线的精度不高,然而我们的很多场合下需要精确估计直线的参数,这时就需要进行直线拟合。

​ 直线拟合的方法有很多,比如:一元线性回归就是一种最简单的直线拟合方法,但是这种方法不适用于提取图像中的直线。因为这种算法假设每个数据点中的x坐标是精确的,Y坐标是带有噪声的,可是在实际的图像中,我们所提取到的点坐标的x、y坐标都是带有噪声的。因此,下面将介绍适用于图像中的精确直线拟合方法。

​ 在介绍拟合过程之前,首先,我们需要明确的是精确的直线拟合过程其实就是使用所有的数据点构建一个包含两个直线方程参数的超定方程组,然后去优化这个方程组,从而计算出直线参数方程的过程。以下为建立超定方程组的过程:

已知条件:二维图像中提取的多个数据点(>=2)。
目标:找到最能“描述这些数据点”的直线方程。
S1:数据点中任意一点(xi,yi)到目标直线的距离为ri
S2:直线拟合就是找到一条直线使得所有数据点到该条直线的距离“在某种意义下”最小,以下数据项即为所要求计算的最小项;

式中:取不同的函数表现为不同的拟合方法,以下为opencv中所支持的几种方法:
方法距离函数
CV_DIST_L1
CV_DIST_L2
CV_DIST_FAIR (C=1.3998)
CV_DIST_HUBER[外链图片转存失败(img-lpGd8JF8-1565651177264)(https://latex.codecogs.com/png.latex?%5Crho%20%28r%29%3D%5Cbegin%7Bcases%7D%20%5Cfrac%7Br%5E%7B2%7D%7D%7B2%7D%26%20%5Ctext%7B%20if%20%7D%20r%3CC%20%5C%5C%20C%28r-%5Cfrac%7BC%7D%7B2%7D%29%26%20%5Ctext%7B%20if%20%7D%20otherwise%20%5Cend%7Bcases%7D)] (C=1.345)

opencv中的直线合函数使用非常简单,具体可参考官方网站说明。其中,有一点需要说明一下,该函数计算出的直线参数信息在参数line中,该参数是cv::Vec4f类型,其中line[0]和line[1]代表直线的方向向量,而line[2]和line[3]代表直线上的一点坐标(直线方程:y=kx+b,k=line[1]/line[0],b=line[3]-k*line[2])。

Ransac直线拟合

Ransac,即随机采样一致性算法,最早用于计算位姿问题,目前已经广泛应用于估计任意模型的参数问题。对于数据中存在大比例的错误点,该方法十分有效,下面就以直线估计的例子来说明。

算法流程:

1.随机选择两点(确定一条直线所需要的最小点集为2),由这两点确定一条直线l;
2.根据阈值t,计算与直线l的几何距离小于t的数据点击S(l),并称它为直线l的一致集;
3.重复若干次选择,得到直线l1,l2,…,ln和相应的一致集S…;
4.使用几何距离,计算最大一致集的最佳拟合直线,作为数据点的最佳匹配直线。

测试

生成一条直线上随机的20个点,然后随机添加100个距离该直线>10的点,分别使用opencv中的fitLine函数和ransac版的函数进行拟合,以下为拟合结果:

图1 左侧为数据点,黑色点为直线上数据点,蓝色为噪声点;右侧为拟合的直线(蓝色为fitLine拟合的结果,红色为ransac拟合的结果

三维点拟合—待续

大家好,我主要的研究方向有:
1)主流的结构光三维测量方法,包括:线扫,格雷码,相移,散斑等;
2)摄像机标定和投影仪标定;
3)点云处理;
4)图像处理;
5)Halcon应用;
6)机器视觉相机选型。

对以上研究方向感兴趣的朋友可以关注我的微信公众号:


http://chatgpt.dhexx.cn/article/Qo1lwCS5.shtml

相关文章

直线拟合最小二乘法

数据 x(1,2,3,4,5) y (1,1.5,3,4.5,5) 算法结果 R语言运行结果 算法原理 x的均值: xpsum(x1x2x3…xn)/n y的均值 : ypsum(y1y2y3…yn)/n x的平方差之和: lxxsum( (xi-xp) ^ 2 ) 协方差之和 lxy…

直线生成以及pcl直线拟合

目录 写在前面codecompile&run result参考 写在前面 1、本文内容 pcl直线拟合,生成带噪声的直线并进行直线拟合的demo 2、平台 windows, pcl1.10.0 3、转载请注明出处: https://blog.csdn.net/qq_41102371/article/details/127147223 code line_…

opencv 直线拟合

一、话说直线拟合 霍夫直线检测容易受到线段形状与噪声的干扰而失真,这个时候我们需要另辟蹊径,通过对图像进行二值分析,提取骨架,对骨架像素点拟合生成直线,这种做法在一些场景下非常有效,而且效果还比较…

拟合算法之一 直线拟合

直线拟合 很早就想学习拟合了,经常听同事用到拟合,当时尚且一窍不通,必须快递加急紧追此处才是,也参考了网上大佬的一些宝贵经验,先将拟合方法总结如下: 最小二乘法 1.原理 2.举例实现 void fitline3(…

直线拟合问题(Python实现)

程序如下: import matplotlib.pyplot as plt import numpy as npx_list [466, 741, 950, 1422, 1634] y_list [7.04, 4.28, 3.40, 2.54, 2.13] # x_list [0, 1, 3, 5] # y_list [1, 2, 4, 8]l_mat11 len(x_list) l_mat12 l_mat21 sum(x for x in x_list) l_…

OpenCV直线拟合检测

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达本文转自:opencv学堂 OpenCV直线拟合检测 霍夫直线检测容易受到线段形状与噪声的干扰而失真,这个时候我们需要另辟蹊径,通过对图像进行…

RANSAC 直线拟合

result&#xff1a; code&#xff1a; #include "stdafx.h". #include <opencv2\opencv.hpp> #include <iostream> #include <ctime>using namespace std; using namespace cv;//生成[0,1]之间符合均匀分布的数 double uniformRandom(void) {ret…

OpenCV——直线拟合

相比于直线检测&#xff0c;直线拟合的最大特点是将所有数据只拟合出一条直线 void fitLine( InputArray points, OutputArray line, int distType,double param, double reps, double aeps ); points&#xff1a;输入待拟合直线的2D或者3D点集。line&#xff1a;输出描述直线…

直线拟合

在进行直线拟合算法中&#xff0c;一直使用最小二乘法&#xff0c;使用时间长了&#xff0c;也比较熟练了&#xff0c;但是在最近一次使用中&#xff0c;最小二乘法在拟合垂直或者接近垂直的直线时&#xff0c;效果不好&#xff1b;斜率很大&#xff0c;使用稳定性不好。查阅《…

Android 冷启动 热启动 测试

一、应用的启动 启动方式 通常来说&#xff0c;在安卓中应用的启动方式分为两种&#xff1a;冷启动和热启动。 1、冷启动&#xff1a;当启动应用时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c;这个启动方式就是冷启动…

Spring Boot 热启动

目的&#xff1a;修改类文件可以马上编译发布&#xff0c;提高了工作效率 步骤&#xff1a; 第一步&#xff1a; 修改pom.xml <!-- 热启动 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools&l…

APP冷热启动专项测试

一、冷热启动的概念 冷启动&#xff1a;当启动应用时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c;这个启动方式就是冷启动。 热启动&#xff1a;当启动应用时&#xff0c;后台已有该应用的进程&#xff08;例&#…

嵌入式linux热启动和冷启动,使用keil判断ARM的冷启动和热启动的方法

微处理器:LPC2114 编译环境:Keil MDK V4.10 思路: 常把单片机系统的复位分为冷启动和热启动。所谓冷启动&#xff0c;也就是一般所说的上电复位&#xff0c;冷启动后片内外RAM的内容是随机的&#xff0c;通常是0x00或0xFF&#xff1b;单片机的热启动是通过外部电路给运行中的单…

Android冷启动和热启动以及冷启动优化方案

1、什么是冷启动和热启动 冷启动&#xff1a; 当启动应用时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c;这个启动方式就是冷启动&#xff0c;也就是先实例化Application。热启动&#xff1a; 当启动应用时&#xff0…

冷启动和热启动的区别android,app冷启动和热启动的区别(详解两者定义及区别)...

介绍一下 app 冷启动和热启动方式来实现 app 秒开的效果。那么,先来看看什么叫冷启动和热启动。 冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动。 热启动:指 app 没有被后台杀死,仍然在后台运行,通常我们再次去打开这个 app,这种启动方式叫热…

热启动和冷启动以及复位启动的小知识

热启动和冷启动的区别&#xff1a; 1、重启是热启动。开机是冷启动。 2、热启动是通过开始菜单、任务管理器或者快捷键&#xff0c;重新启动计算机&#xff0c;叫热启动。冷启动是在关机状态下按POWER启动计算机&#xff0c;叫做冷启动 。 3、热启动是在计算机已经开启的状态…

dimen属性报错

<TextViewandroid:id"id/tvQuote1"android:layout_width"fill_parent"android:layout_height"wrap_content"android:textColor"#FFFFFF"android:textSize"dimen/text_size" /> 发现问题是dimen属性出现错误 别的手机上…

解决android:padding=“@dimen/activity_vertical_margin“> 标红问题

解决android:padding“dimen/activity_vertical_margin”> 标红问题 如果有这个问题&#xff0c;可以在values中新建一个dimen.xml文件 在dimen.xml里增加如下代码&#xff1a; <?xml version"1.0" encoding"utf-8"?><resources><…

android:paddingTop=“@dimen/activity_horizontal_margin“报错(报红)解决方法

android:paddingTop"dimen/activity_horizontal_margin"报错&#xff08;报红&#xff09;解决方法 在app----->res----->values------>dimens.xml中添加如下代码&#xff1a; <dimen name“activity_horizontal_margin” / (后面还有一个尖括号)&#…

android 手机适配之values适配dimen值

android 适配屏幕的方式有很多,最方便最直接的无非就是适配values里的dimens文件值来进行适配. 张鸿洋大神已经写过一篇适配的文章,很详细 但是我在阅读的时候还是有点疑问,这个values-1920x1080到底是dp值还是手机分辨率,因为我在实际操作中发现这样一句话. 很明显可以看…