java 椭圆拟合,OpenCV2马拉松第25圈——直线拟合与RANSAC算法

article/2025/11/8 2:17:53

最小二乘法(least square)拟合

Total least square 拟合

RANSAC拟合

葵花宝典

gGdXprx1d4

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjZDE5OTI3MTln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

终于,我们就能解出B

可是。这样的least square有问题,比方针对垂直线段就不行。于是引入另外一种total least square

8207e958fc5f12ab519ffc8f0886f69e.png

277595ce751fa3fa43b61103bbe600be.png

我们能够计算得到N,解出(a,b),然后得到d.

可是误差点对least square的影响非常大。例如以下

gGdXprx1d4

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjZDE5OTI3MTln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

gGdXprx1d4

于是,提出了RANSAC算法

随机在数据集中选出小的子集(对于直线,一般选2)

计算得到符合这个子集合的最好模型

找到接近符合这个模型的数据集

迭代一定次数,选出最好的模型

有图有真相

gGdXprx1d4

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjZDE5OTI3MTln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

或者參考这里

RANSAC用在直线拟合上。就是

Repeat N times:

•Draws points uniformly at random

•Fit line to theses points

•Find inliers to this line among the remaining points(i.e., points whose distance from the line is less thant)

•If there ared or more inliers, accept the line and refit using all inliers(refit的意思就是:我们迭代后找到了一条最好直线,如果有200个接近点。那么就用这200个点再进行least

square又一次拟合下)

RANSAC是一个概率算法,迭代次数越多越准确

•Pros

•简单通用

•能够解决非常多问题

•实践有效

•Cons

•须要确定一系列參数

•有时候须要迭代次数多。概率算法有时候会失败

•最小样本数无法得到有效模型

初识API

OpenCV提供了一个拟合直线的方法。能够拟合2维和3维空间的直线

C++:void fitLine(InputArray points,

OutputArray line, int distType, double param, double reps, double aeps)

points – 2D或者3D点的输入向量。存储在std::vector<> 或者 Mat中.

line –2D来说 (就像Vec4f) - (vx, vy, x0, y0),(vx, vy)是归一化直线方向,(x0, y0)是直线上的一个点.

对于3D的拟合 (就如 Vec6f) - (vx, vy, vz, x0, y0, z0),

distType – 例如以下

param – 一般取0

reps – 一般取0.01

aeps – 一般取0.01

The function fitLine fits a line to a 2D or 3D point set by minimizing

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvZjgxZjE1NWM1MDRlMGNkZWNkYzY4M2Q2OTJmMjcyNzZiYjdiNWM0Yy5wbmc=.jpg where 

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvOTZjNDIwNzdmMmE0NDdjYTU0OGNkYmZlNjNmMTkzMmU5ODY2ZGYzYS5wbmc=.jpg is

a distance between the

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvZmZiZDU1NTk3MjcyYTk5MTQxNjZjNWRkMWU3MWE1ZDIzZDg0MmRkZC5wbmc=.jpg point, the line and 

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvNDVkZTcyMzY2MzFjNjY1N2Q0YzM4MGMxNDJmYWE5Yjg5ZjhkMDQ0Ny5wbmc=.jpg is

a distance function, one of the following:

distType=CV_DIST_L2

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvMmZmZTkxMjEzYmYzNDk0NWU5NDljNGJjZWMxODhiNDAxZGQ3OGRmNC5wbmc=.jpg

distType=CV_DIST_L1

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvYTAyN2JhYTk3Mjg4MWIyMDY0NzExZTFhMTI4ZGI5MWY0ZDA5MzQ1Ni5wbmc=.jpg

distType=CV_DIST_L12

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvMTZiY2I5MDhhMzMxZTNmNGU5ODRjMzcwYjY2NmU2ZmNjODY5ZWM5Yi5wbmc=.jpg

distType=CV_DIST_FAIR

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvMzRiYjdlNzlkNzU5ZjUxMjMyYmE1YmFiNjAyZGNhMGI3ZDM5Y2QyNC5wbmc=.jpg

distType=CV_DIST_WELSCH

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvNDI0OTk2NWNiODZhMmFjY2RhYTM5NmFiOWY2ODJiYWZlM2ZmYjkzNS5wbmc=.jpg

distType=CV_DIST_HUBER

L3Byb3h5L2h0dHAvZG9jcy5vcGVuY3Yub3JnL21hc3Rlci9faW1hZ2VzL21hdGgvNjViMzM3Y2Y3ZTFmYzRiM2VmMzdlYjgxNzMwNTMzYjEwOWMzOWU5Yi5wbmc=.jpg

荷枪实弹

cv::Vec4f line;

cv::fitLine(cv::Mat(points),line,CV_DIST_L2, 0, 0.01,0.01);

这样调用,就能够得到我们的直线參数

举一反三

cv::fitEllipse 在一系列2D点中拟合椭圆. 它返回一个旋转过的矩形 (一个cv::RotatedRect实例),椭圆内切于这个矩形.

你能够书写例如以下代码:

cv::RotatedRect rrect= cv::fitEllipse(cv::Mat(points));

cv::ellipse(image,rrect,cv::Scalar(0));

函数cv::ellipse用来画出你得到的椭圆


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

相关文章

激光数据的直线拟合

激光雷达获取的信息是和周围物体之间的距离信息&#xff0c;在移动机器人尤其是自主移动机器人领域具有非常广泛的应用&#xff0c;那我们就从移动机器人的自主导航开始聊吧。 移动机器人导航是指移动机器人依靠传感器在特定环境中&#xff0c;按时间最优、路径最短或能耗最低…

直线拟合2

Opencv中的fitLine函数&#xff0c;实现了《直线拟合》一文中的总体最小二乘法拟合直线。 C: void fitLine(InputArray points, OutputArray line, int distType, double param, double reps, double aeps) 参数说明&#xff1a; points&#xff1a;需要拟合的点&#xff1b; L…

C++ 最小二乘法 直线拟合、曲线拟合、平面拟合、高斯拟合

本节介绍如何用Eigen求解线性最小二乘方程组。求解Axb的最小二乘问题&#xff0c;等价于求解方程 使用Eigen的求解的代码如下&#xff1a; Eigen::MatrixXd MatX;//样本数据Eigen::MatrixXd MatY;//观测值Eigen::MatrixXd MatLS;//待定系数MatLS (MatX.transpose() * MatX).in…

C语言直线拟合函数

直线拟合算法 函数说明&#xff1a; 通过一些点拟合出一条直线。 参数&#xff1a; pt_input 指向传入的点的指针。 ptNumbers 传入的点数量。 k 指向拟合直线参数k的指针。 b 指向拟合直线参数b的指针。 返回值&#xff1a; 返回一个代数值判断拟合是否成功。如果成功…

用RANSAC算法实现干扰严重的直线拟合~

1.说到直线拟合&#xff0c;一般是用最小二乘啦&#xff0c;在opencv里面就是用cv.fitLine来完成&#xff0c;首先简单介绍一下该函数&#xff1a; cv.fitLine(points, distType, param, reps, aeps[, line]) -> line points&#xff1a;点集坐标 distType&#xff1a;距…

RANSAC直线拟合和最小二乘直线拟合的简单介绍

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果&#xff1b;为了提高概率必须提高迭代次…

RANSAC三维直线拟合

RANSAC算法 &#xff08;1&#xff09;要得到一个直线模型&#xff0c;需要两个点唯一确定一个直线方程。所以第一步随机选择两个点&#xff1b; &#xff08;2&#xff09;通过这两个点&#xff0c;可以计算出这两个点所表示的模型方程&#xff1b; &#xff08;3&#xff09…

二维直线拟合--opencv实现

二维/三维直线拟合–opencv实现 ​ Hough变换可以提取图像中的直线&#xff0c;但是提取线的精度不高&#xff0c;然而我们的很多场合下需要精确估计直线的参数&#xff0c;这时就需要进行直线拟合。 ​ 直线拟合的方法有很多&#xff0c;比如&#xff1a;一元线性回归就是一…

直线拟合最小二乘法

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

直线生成以及pcl直线拟合

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

opencv 直线拟合

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

拟合算法之一 直线拟合

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

直线拟合问题(Python实现)

程序如下&#xff1a; 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直线拟合检测

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

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;例&#…