当前位置: 首页 > news >正文

OpenCV结构分析与形状描述符(12)椭圆拟合函数fitEllipseAMS()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

围绕一组2D点拟合一个椭圆。

该函数计算出一个椭圆,该椭圆拟合一组2D点。它返回一个内切于该椭圆的旋转矩形。使用了由[260]提出的近似均方差(AMS)方法。

对于椭圆,这个基集是 χ = ( x 2 , x y , y 2 , x , y , 1 ) \chi= \left(x^2, x y, y^2, x, y, 1\right) χ=(x2,xy,y2,x,y,1),这是一个包含六个自由系数的集合 A T = { A xx , A xy , A yy , A x , A y , A 0 } A^T=\left\{A_{\text{xx}},A_{\text{xy}},A_{\text{yy}},A_x,A_y,A_0\right\} AT={Axx,Axy,Ayy,Ax,Ay,A0}然而,要指定一个椭圆,只需要五个数字;主轴和次轴的长度 ( a , b ) (a,b) (a,b),位置 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)以及方向 θ。这是因为基集包含了直线、二次函数、抛物线和双曲线函数以及椭圆函数作为可能的拟合。如果发现拟合是一个抛物线或双曲线函数,则使用标准的 fitEllipse 方法。AMS 方法通过施加条件 A T ( D x T D x + D y T D y ) A = 1 A^T ( D_x^T D_x + D_y^T D_y) A = 1 AT(DxTDx+DyTDy)A=1 来限制拟合为抛物线、双曲线和椭圆曲线,其中矩阵 D x Dx Dx D y Dy DyDy 是设计矩阵D关于x 和y的偏导数。矩阵是通过逐行应用以下规则来形成的,针对点集中的每一个点: D ( i , : ) = { x i 2 , x i y i , y i 2 , x i , y i , 1 } D x ( i , : ) = { 2 x i , y i , 0 , 1 , 0 , 0 } D y ( i , : ) = { 0 , x i , 2 y i , 0 , 1 , 0 } \begin{align*} D(i,:)&=\left\{x_i^2, x_i y_i, y_i^2, x_i, y_i, 1\right\} & D_x(i,:)&=\left\{2 x_i,y_i,0,1,0,0\right\} & D_y(i,:)&=\left\{0,x_i,2 y_i,0,1,0\right\} \end{align*} D(i,:)={xi2,xiyi,yi2,xi,yi,1}Dx(i,:)={2xi,yi,0,1,0,0}Dy(i,:)={0,xi,2yi,0,1,0}
AMS 方法最小化成本函数:
ϵ 2 = A T D T D A A T ( D x T D x + D y T D y ) A T \begin{equation*} \epsilon ^2=\frac{ A^T D^T D A }{ A^T (D_x^T D_x + D_y^T D_y) A^T } \end{equation*} ϵ2=AT(DxTDx+DyTDy)ATATDTDA
通过求解广义特征值问题找到最小成本。
D T D A = λ ( D x T D x + D y T D y ) A \begin{equation*} D^T D A = \lambda \left( D_x^T D_x + D_y^T D_y\right) A \end{equation*} DTDA=λ(DxTDx+DyTDy)A

fitEllipseAMS 是 OpenCV 中用于拟合椭圆的一个函数,它使用了“代数方法”(Algebraic Method)来进行椭圆拟合。相比于 fitEllipse 函数使用的最小二乘法,fitEllipseAMS 更侧重于代数意义上的拟合,适用于某些特定的应用场景。

函数原型


RotatedRect cv::fitEllipseAMS
(InputArray 	points
)	

参数

  • points 输入的2D点集,存储在 std::vector<> 或 Mat 中。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{// 创建一个空白图像Mat img( 400, 400, CV_8UC3, Scalar( 255, 255, 255 ) );// 创建一组2D点vector< Point2f > points;points.push_back( Point2f( 100, 100 ) );points.push_back( Point2f( 200, 100 ) );points.push_back( Point2f( 200, 200 ) );points.push_back( Point2f( 100, 200 ) );points.push_back( Point2f( 150, 150 ) );points.push_back( Point2f( 150, 250 ) );points.push_back( Point2f( 250, 150 ) );points.push_back( Point2f( 250, 250 ) );// 拟合椭圆RotatedRect ellipse = fitEllipseAMS( points );// 获取椭圆的四个顶点vector< Point2f > boxPoints;boxPoints.resize( 4 );  // 确保boxPoints至少有4个元素ellipse.points( boxPoints.data() );// 将 Point2f 转换为 Pointvector< Point > intBoxPoints;for ( const auto& pt : boxPoints ){intBoxPoints.push_back( Point( static_cast< int >( pt.x ), static_cast< int >( pt.y ) ) );}// 在原图上绘制椭圆polylines( img, intBoxPoints, true, Scalar( 0, 0, 255 ), 2, LINE_8 );// 绘制点集for ( const auto& pt : points ){circle( img, pt, 5, Scalar( 0, 255, 0 ), -1 );}// 显示结果imshow( "Ellipse Fitting (AMS)", img );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

相关文章:

OpenCV结构分析与形状描述符(12)椭圆拟合函数fitEllipseAMS()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆&#xff0c;该椭圆拟合一组2D点。它返回一个内切于该椭圆的旋转矩形。使用了由[260]提出的近…...

安卓显示驱动

安卓显示驱动是用于在Android设备上提供图形和视频显示的底层软件组件。 显示驱动在Android系统中扮演着至关重要的角色&#xff0c;它们负责将图形和视频内容从系统内存传输到显示屏上。这些驱动程序确保了用户界面、图像、视频和游戏等视觉元素的正常显示。以下是关于安卓显…...

java重点学习-集合(List)

七 集合&#xff08;List&#xff09; 7.1 复杂度分析 7.2 数组 1.数组(Array)是一种用连续的内存空间存储相同数据类型 数据的线性数据结构。 2.数组下标为什么从0开始 寻址公式是:baseAddressi*dataTypeSize&#xff0c;计算下标的内存地址效率较高 3.查找的时间复杂度 随机(…...

【PCB测试】最常见的PCB测试方法

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、PCB测试的好处1.发现错误2.降低成本3.节省时间4.减少退货率5.提高安全性 二、PCB测试内容1.孔壁质量2.电镀铜3.清…...

AtCoder Beginner Contest 370 ABCD题详细题解(C++,Python)

前言: 本文为AtCoder Beginner Contest 370 ABCD题的详细题解&#xff0c;包含C,Python语言描述&#xff0c;觉得有帮助或者写的不错可以点个赞 个人感觉D比C简单&#xff0c;C那里的字典序有点不理解, E应该是前缀和加dp&#xff0c;但是是dp不明白&#xff0c;等我明白了会更…...

斯坦福研究人员探讨大型语言模型在社交网络生成中的应用及其在政治同质性上的偏见

社交网络生成在许多领域有着广泛的应用&#xff0c;比如流行病建模、社交媒体模拟以及理解社交现象如两极化等。当由于隐私问题或其他限制无法直接观察真实网络时&#xff0c;创建逼真的社交网络就显得尤为重要。这些生成的网络对于在这些情况下准确建模互动和预测结果至关重要…...

一招教你找到Facebook广告的最佳发帖时间

在社交媒体上做广告时&#xff0c;时机是至关重要的。有时候你投放的广告参与度低&#xff0c;很有可能是因为你没有在适当的时机投放广告。这篇文章会教你如何找到适合自己的广告投放时间&#xff0c;如果你感兴趣的话&#xff0c;就继续看下去吧&#xff01; 首先&#xff0…...

【数据库】MySQL-基础篇-多表查询

专栏文章索引&#xff1a;数据库 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、多表关系 1.一对多 2.多对多 3.一对一 二、多表查询概述 1.数据准备 2.概述 3.分类 三、内连接 1.隐式内连接 2.显式内连接 3.案例 四、外连接 1.左外连接 2.右外连…...

MongoDB事务机制

事务机制 1.事务概念 在对数据的操作的过程中&#xff0c;涉及到一连串的操作&#xff0c;这些操作如果失败&#xff0c;会导致我们的数据部分变化了&#xff0c;部分没变化。这个过程就好比如你去吃早餐&#xff0c;你点完餐了&#xff0c;并且吃完早餐了&#xff0c;没付钱你…...

大模型 LLM(Large Language Models)如今十分火爆,对于初入此领域的新人小白来说,应该如何入门 LLM 呢?是否有值得推荐的入门教程呢?

前言 很明显&#xff0c;这是一个偏学术方向的指南要求&#xff0c;所以我会把整个LLM应用的从数学到编程语言&#xff0c;从框架到常用模型的学习方法&#xff0c;给你捋一个通透。也可能是不爱学习的劝退文。 通常要达到熟练的进行LLM相关的学术研究与开发&#xff0c;至少…...

Python实现模糊逻辑算法

博客目录 引言 什么是模糊逻辑&#xff1f;模糊逻辑的应用场景模糊逻辑的基本思想 模糊逻辑的原理 模糊集合与隶属函数模糊推理系统&#xff08;FIS&#xff09;模糊规则和推理过程 Python实现模糊逻辑算法 面向对象的设计思路代码实现示例与解释 模糊逻辑算法应用实例&…...

MATLAB、FPGA、STM32中调用FFT计算频率、幅值及相位差

系列文章目录 文章目录 系列文章目录前言MATLABSTM32调用DSPSTM32中实现FFT关于初相位 FPGA 前言 最近在学习如何在STM32中调用FFT MATLAB 首先对FFT进行一下说明&#xff0c;我们输入N个点的数据到FFT中&#xff0c;FFT会返回N个点的数据&#xff0c;这些数据都是复数&#…...

基于SSM的医院药品库存系统的设计与实现---附源码76620

摘要 医院药品库存管理是医院管理的重要组成部分&#xff0c;对于保障医疗服务的质量和效率具有重要意义。传统的手工管理方式已经无法满足药品库存管理的需求&#xff0c;因此建立一个医院药品库存系统具有重要的实践价值。 使用Java语言开发医院药品库存系统可以兼容不同操作…...

Jupyter管理内核命令

1.显示有哪些内核 jupyter kernelspec list2.删除某个内核 jupyter kernelspec remove xxx3.添加某个内核 先激活环境 conda activate test_env然后安装ipykernel包 pip install ipykernel在虚拟环境中安装ipykernel包 python -m ipykernel install --name test_env安装过…...

简单分享-获取.txt文件内数据 文件内数据逗号分隔 分隔符 C语言

简单分享-获取.txt文件内数据 文件内数据逗号分隔 分隔符 C语言 数据存储到文件中&#xff0c;把文件数据读取到数组&#xff0c;方便数据处理。 # include <stdio.h> # include <stdlib.h> # include <string.h>#define DATANUM 307200 //数组个数 int ma…...

从0开始手把手带你入门Vue3

前言 本文并非标题党&#xff0c;而是实实在在的硬核文章&#xff0c;如果有想要学习Vue3的网友&#xff0c;可以大致的浏览一下本文&#xff0c;总体来说本篇博客涵盖了Vue3中绝大部分内容&#xff0c;包含常用的CompositionAPI(组合式API)、其它CompositionAPI以及一些新的特…...

C# USB通信技术(通过LibUsbDotNet库)

文章目录 1.下载LibusbDotNet库2.引入命名空间3. 实例化USB设备4.发送数据5.关闭连接 1.下载LibusbDotNet库 右击项目选择管理NuGet程序包在弹出的界面中搜索LibusbDotNet&#xff0c;然后下载安装。 2.引入命名空间 using LibUsbDotNet; using LibUsbDotNet.Main;3. 实例化…...

常用Java API

1 字符串处理 1.1 String 类 String 类是 Java 中不可变的字符序列。它提供了以下常用方法&#xff1a; length()&#xff1a;返回字符串的长度。 charAt(index)&#xff1a;返回指定索引处的字符。 substring(startIndex, endIndex)&#xff1a;返回从 startIndex 到 endI…...

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化&#xff0c;使其看起来更清晰&#xff0c;同时保持尺寸不变&#xff0c;通常涉及到图像处理技术如锐化、降噪、对比度增强…...

Java 回顾方法的定义

一、方法的定义 1&#xff0e;修饰符&#xff08;public static…&#xff09;详见博客【Java 方法的定义】 2&#xff0e;返回值&#xff08;int, double, char[],…., void&#xff09;详见博客【Java 方法的定义】 3. break&#xff1a;跳出switch 结束循环&#xff0c;详…...

3个高效构建Web可视化应用的Meta2d.js核心方案:从问题到实践指南

3个高效构建Web可视化应用的Meta2d.js核心方案&#xff1a;从问题到实践指南 【免费下载链接】meta2d.js The meta2d.js is real-time data exchange and interactive web 2D engine. Developers are able to build Web SCADA, IoT, Digital twins and so on. Meta2d.js是一个实…...

从CPU到内存:用74LS74芯片手把手教你搭建一个D边沿触发器(附波形图分析)

从面包板到示波器&#xff1a;用74LS74芯片实战D边沿触发器的完整指南 当你第一次在数字电路课本上看到"D边沿触发器"这个词时&#xff0c;是否感觉它像是一个抽象的黑盒子&#xff1f;教科书上的真值表和波形图虽然精确&#xff0c;但总缺少那么一点"触手可及&…...

二手车价格预测:特征工程比调参重要10倍!我的天池赛从800分降到490分的实战复盘

二手车价格预测实战&#xff1a;如何通过特征工程将MAE从800降到490 二手车市场向来以信息不对称为特点&#xff0c;价格波动大、影响因素复杂。对于数据科学家来说&#xff0c;准确预测二手车价格不仅是一个有趣的机器学习挑战&#xff0c;更是一个极具商业价值的实际问题。在…...

3个关键场景与4步操作:深入解析RevokeMsgPatcher防撤回工具的技术实现与应用实践

3个关键场景与4步操作&#xff1a;深入解析RevokeMsgPatcher防撤回工具的技术实现与应用实践 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目…...

GLM-4.1V-9B-Base行业落地:建筑图纸局部区域语义理解与标注建议

GLM-4.1V-9B-Base行业落地&#xff1a;建筑图纸局部区域语义理解与标注建议 1. 建筑行业的AI视觉理解需求 建筑设计和施工过程中&#xff0c;图纸理解与标注是一项耗时且容易出错的工作。传统方式需要经验丰富的工程师手动识别图纸中的各个元素&#xff0c;不仅效率低下&…...

如何用OpenRGB终结RGB灯光控制混乱:终极跨平台解决方案

如何用OpenRGB终结RGB灯光控制混乱&#xff1a;终极跨平台解决方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Relea…...

ngx_http_join_exact_locations

1 定义 ngx_http_join_exact_locations 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.cstatic ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf, ngx_queue_t *locations) {ngx_queue_t *q, *x;ngx_http_location_queue_t *lq, *lx;q ngx_queue_he…...

嵌入式串口通信中的结构体与浮点数转换技巧

1. 串口数据传输中的结构体转换问题在嵌入式系统开发中&#xff0c;串口通信是最基础也最常用的数据传输方式之一。作为一名长期从事嵌入式开发的工程师&#xff0c;我经常遇到需要传输复杂数据类型的情况。串口本身只能以字节为单位传输数据&#xff0c;这就带来了一个关键问题…...

H5端微信登录实战:从配置到用户信息获取的全流程解析

1. 为什么需要H5端微信登录&#xff1f; 每次开发新项目时&#xff0c;用户注册环节总是让人头疼。传统的账号密码注册方式&#xff0c;不仅流程繁琐&#xff0c;还经常遇到用户忘记密码的问题。我在去年开发一个电商H5项目时&#xff0c;就发现超过60%的用户流失都发生在注册…...

球机器人研究报告【202600001】

文章目录球机器人研究报告综合分析多智能体推箱子训练&#xff08;第100代/第300代&#xff09;一、意识流分析&#xff08;神经网络脉冲活动&#xff09;1. 热图&#xff08;consciousness_agent2_gen100_ep0_heatmap.png&#xff09;2. PCA&#xff08;主成分分析&#xff0c…...