学习2d直线拟合-2

devtools/2024/9/25 10:31:58/

参考文章

直线拟合算法(续:加权最小二乘)_加权拟合直线法-CSDN博客

对比了参考文中和opencv中的直线拟合权重,不知道理解的对不对,前者是权重平方,后者没有平方

QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QMainWindow(parent)
{//权重QList<qreal> _w{ 1,0.6,0.7,0.5,1 };QList<QPointF> points{ QPointF(1,3),QPointF(7,5),QPointF(10,5),QPointF(20,99),QPointF(50,200), };int size = points.size();qreal x_mean = 0;qreal y_mean = 0;qreal sum_wx = 0, sum_wy = 0, sum_w = 0;for (int i = 0; i < size; i++){qreal x = points[i].x();qreal y = points[i].y();qreal w = _w[i];sum_wx += w * w * x;sum_wy += w * w * y;sum_w += w * w;}x_mean = sum_wx / sum_w;y_mean = sum_wy / sum_w; //至此,计算出了 x y 的均值double Dxx = 0, Dxy = 0, Dyy = 0;double xy_mean1 = 0,xx_mean1 = 0, yy_mean1 = 0;double x_mean2=0, y_mean2, xy_mean2 = 0, xx_mean2 = 0, yy_mean2 = 0;qreal  w_sum2=0;for (int i = 0; i < size; i++){qreal x = points[i].x();qreal y = points[i].y();qreal w = _w[i];w = w * w;Dxx += w * (x - x_mean) * (x - x_mean);Dxy += w * (x - x_mean) * (y - y_mean);Dyy += w * (y - y_mean) * (y - y_mean);xy_mean1 += w*x*y;xx_mean1 += w*x*x;yy_mean1 += w*y*y;qreal w2 = _w[i];x_mean2 += w2*x;y_mean2 += w2*y;xy_mean2 += w2*x*y;xx_mean2 += w2*x*x;yy_mean2 += w2*y*y;w_sum2 +=w2;}xy_mean1 /= sum_w;xx_mean1 /= sum_w;yy_mean1 /= sum_w;x_mean2 /= w_sum2;y_mean2 /= w_sum2;xy_mean2 /= w_sum2;xx_mean2 /= w_sum2;yy_mean2 /= w_sum2;double a, b, c;double lambda = ((Dxx + Dyy) - sqrt((Dxx - Dyy) * (Dxx - Dyy) + 4 * Dxy * Dxy)) / 2.0;double den = sqrt(Dxy * Dxy + (lambda - Dxx) * (lambda - Dxx));if (fabs(den) < 1e-5){if (fabs(Dxx / Dyy - 1) < 1e-5) //这时没有一个特殊的直线方向,无法拟合{return;}else{a = 1;b = 0;c = -a * x_mean - b * y_mean;}}else{a = Dxy / den;b = (lambda - Dxx) / den;c = -a * x_mean - b * y_mean;}double dxx1 = xx_mean1 - x_mean*x_mean;double dyy1 = yy_mean1 - y_mean*y_mean;double dxy1 = xy_mean1 - x_mean*y_mean;double t1 = atan2(2*dxy1,dxx1-dyy1) / 2;double aa = sin(t1);//测试aa等于adouble bb = -cos(t1);//测试bb等于bdouble dxx2 = xx_mean2 - x_mean2*x_mean2;double dyy2 = yy_mean2 - y_mean2*y_mean2;double dxy2 = xy_mean2 - x_mean2*y_mean2;double t2= atan2(2 * dxy2, dxx2 - dyy2) / 2;double aaa = sin(t2);//测试aaa不等于aadouble bbb = -cos(t2);//测试bbb不等于bb//opencv modules/imgproc/src/linefit.cpp->fitLine2D_wods 方法下//line[0] = (float)cos(t);不等于博文中的 -b//line[1] = (float)sin(t);不等于博文中的 a//唯一的不同之处在于博文中的是权重平方,opencv中没有平方ui.setupUi(this);
}

运行结果


http://www.ppmy.cn/devtools/99672.html

相关文章

【图像增强】使用 Albumentations Python 库(01)

目录 一、说明 二、Albumentations库 2.1 如何安装 2.2 测试代码示例 2.3 在albumentations库中实现的所有像素级变换 2.4 空间级转换 2.5 混合级别转换 三、让我们看看上述实现中的转换。 3.1 在专辑中实现的天气相关转换 3.2 随机雨 3.3 在相册中处理非 8 位图像 3.4 在文档…

给Go+Sciter开发的桌面客户端软件添加系统托盘图标

在桌面端软件开发中&#xff0c;系统托盘图标是提升用户体验的重要元素。托盘图标不仅能提供直观的状态反馈&#xff0c;还能让软件在后台运行时依然保持与用户的交互。通过托盘图标&#xff0c;用户可以轻松最小化软件、退出程序&#xff0c;甚至弹出通知&#xff0c;从而避免…

大模型入门到精通——使用Embedding API及搭建本地知识库(一)

使用Embedding API及搭建本地知识库 1. 基于智谱AI调用Embedding API实现词向量编码 首先&#xff0c;生成.env 文件&#xff0c;填写好智谱AI的API-key 参考&#xff1a;大模型入门到实战——基于智谱API key 调用大模型文本生成 读取本地/项目的环境变量。 find_dotenv(…

云原生之全链路分布式跟踪系统 Zipkin和SkyWalking

贪多嚼不烂 Pinpoint 就不对比了 参考 APM系统简单对比(zipkin,pinpoint和skywalking) springcloud 看云 Zipkin和SkyWalking都是流行的分布式跟踪系统&#xff0c;但它们的设计和实现有明显的不同。 以下是它们之间的一些对比&#xff1a; 数据存储&#xff1a; Zipk…

用户画像标签服务设计

背景 用户画像中不论是实时标签还是离线标签&#xff0c;对需要对外提供查询服务&#xff0c;以便外部接口可以重新用户的标签&#xff0c;本文就来看一下用户标签服务的设计 用户标签服务设计 不论是离线标签还是实时标签&#xff0c;我们都需要先把他们从hive表或者实时re…

ES系列二之CentOS7安装ES head插件

CentOS7安装ES head插件 附&#xff1a;Centos7中安装Node出现Cannot find module ‘…/lib/utils/unsupported.js‘问题 删除原本的的npm连接&#xff0c;重新建一个即可。 1、先cd到该node版本中的bin文件夹下,这里装的是12.16.2版本&#xff1a; cd /usr/local/soft/nod…

若依/vue2引入threejs展示glb/gltf模型,以及画布截图功能

需求背景&#xff1a;前端对glb/gltf模型进行线上管理&#xff0c;支持上传本地模型&#xff0c;每次上传后展示模型&#xff0c;在提交给后端的时候带上该模型的截图&#xff0c;具体效果不便展示&#xff0c;相关代码如下&#xff1a; 1.安装依赖 // "three": &qu…

Chrome 渲染器中的对象转换到 RCE

在本文中,我将利用CVE-2024-5830,这是 Chrome 的 JavaScript 引擎 v8 中的一个类型混淆错误,我于 2024 年 5 月将其报告为错误 342456991。该错误已在版本126.0.6478.56/57中修复。此错误允许通过一次访问恶意网站在 Chrome 的渲染器沙箱中执行远程代码执行 (RCE)。 V8 中的…