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

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

算法描述

围绕一组2D点拟合一个椭圆。
该函数计算出一个椭圆,该椭圆拟合一组2D点。它返回一个内切于该椭圆的旋转矩形。使用了由[91]提出的直接最小二乘法(Direct)方法。

对于椭圆,这个基集是 χ = ( 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),以及方向 θ。这是因为空间中还包含了直线、二次函数、抛物线和双曲线函数作为可能的拟合。直接方法通过确保 4 A x x A y y − A x y 2 > 0 4 A_{xx} A_{yy}- A_{xy}^2 > 0 4AxxAyyAxy2>0来将拟合限定为椭圆。施加的条件是 4 A x x A y y − A x y 2 = 1 4 A_{xx} A_{yy}- A_{xy}^2=1 4AxxAyyAxy2=1,这满足了不等式,并且由于系数可以任意缩放,因此这一条件并不过于限制

ϵ 2 = A T D T D A 其中 A T C A = 1 并且 C = ( 0 0 2 0 0 0 0 − 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) \begin{equation*} \epsilon ^2= A^T D^T D A \quad \text{其中} \quad A^T C A =1 \quad \text{并且} \quad C=\left(\begin{matrix} 0 & 0 & 2 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 & 0 & 0 \\ 2 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \end{matrix} \right) \end{equation*} ϵ2=ATDTDA其中ATCA=1并且C= 002000010000200000000000000000000000

最小成本是通过求解广义特征值问题找到的。
D T D A = λ ( C ) A \begin{equation*} D^T D A = \lambda \left( C\right) A \end{equation*} DTDA=λ(C)A
系统只产生一个正的特征值 λ,该特征值被选作解,并且其特征向量u也被选出。这些值用来找到系数
A = 1 u T C u u \begin{equation*} A = \sqrt{\frac{1}{\mathbf{u}^T C \mathbf{u}}} \mathbf{u} \end{equation*} A=uTCu1 u
缩放因子保证了 A T C A = 1 A^T C A =1 ATCA=1

fitEllipseDirect 是 OpenCV 中用于拟合椭圆的一个函数,它使用了直接线性最小二乘法(Direct Least Squares Fit)来进行椭圆拟合。这种方法通常比其他方法更快,但也可能在某些情况下不如其他方法稳健。

函数原型


RotatedRect cv::fitEllipseDirect
(
	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 = fitEllipseDirect( points );

    // 获取椭圆的四个顶点
    vector< Point2f > boxPoints;
    boxPoints.resize( 4 );  // 确保boxPoints至少有4个元素
    ellipse.points( boxPoints.data() );

    // 将 Point2f 转换为 Point
    vector< 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 (Direct)", img );
    waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F407+CubeMx串口通信实验(学习记录)

一、环境 硬件&#xff1a;STM32F407ZGT6开发板 软件&#xff1a;STM32CubeMx、Keil5 MDK、串口调试助手 PS:前面实验部分的代码都是可以正常运行的&#xff0c;但是在学习过程中我也踩了很多坑&#xff08;包括一些未弄明白的&#xff09;&#xff0c;我会记录在问题总结部分…

物联网之ESP32控制GPIO输出点亮LED、闪烁LED灯

MENU 前言原理GPIO引脚LED 硬件电路设计软件设计1、点亮一颗LED2、闪烁的LED 前言 不论学习什么单片机&#xff0c;最简单的外设莫过于IO口的高低电平控制LED&#xff0c;本文介绍如何使用Arduino控制ESP32的GPIO输出。通过本文的学习&#xff0c;掌握一定的Arduino程序架构知识…

求求你们别再跟风考PMP了!这几类人才真正需要这本证书!

救命啊&#xff01;&#xff01;&#xff01;这几天刷某书&#xff0c;看到好多人在吐槽说考了PMP证书一点用都没有&#xff0c;每三年还得花个千把块钱去续证&#xff0c;劝大家都别考。 这可能是PMP身上最大的一口“黑锅”了。作为全球认可、含金量极高的项目管理资格认证&am…

AXI4主机测试

前面对AXI4协议进行了比较详细的分析&#xff0c;本篇文章将会写一个主机代码来实现AXI4协议的时序。 设计思路&#xff1a;本次设计的主要目的是验证AXI4_FULL总线的时序&#xff0c;并且提升对AXI4_FULL总线协议的理解&#xff0c;因此可以采用状态机来控制&#xff0c;先向…

孩子用的台灯哪个牌子好?挑选护眼台灯先了解护眼台灯十大排名

孩子们的日常生活中有高达80%的时间是在阅读、做作业或面对电脑屏幕中度过的&#xff0c;因此对良好照明的需求显得尤为严格和精确。一些家长可能认为&#xff0c;只要孩子使用的是纸质材料&#xff0c;不像电子产品那样对眼睛有害&#xff0c;使用普通的台灯照明就足够了&…

mysql快速定位cpu 占比过高的sql语句

mysql快速定位cpu 占比过高的sql语句 当MySQL数据库的CPU使用率异常升高时&#xff0c;定位导致问题的SQL语句可以通过以下步骤进行 1、使用top命令找出mysl进程中占用CPU靠前的线程 #找出mysql 的进程号 ps -ef | grep mysql#根据进程号&#xff0c;找出占用CPU靠前的线程号…

【QT】文件读写,文件对话框

一.QFile类 QFile提供了从文件中读取和写入数据的能力。 我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后&#xff0c;使用setFileName()来修改。 QFile是QIODevice的子类&#xff0c;利用QFile可以对文件进行打开&#xff0c;读取&#xff0c…

Bootstrap 5.3版本创建常用页面

你可以根据自己的主题需求来自定义样式。Bootstrap提供了丰富的CSS类和组件&#xff0c;使得创建响应式、移动优先的网站变得简单。下面我将指导你如何基于Bootstrap 5.3来编写一个简单但自定义主题的页面。 引入Bootstrap 首先&#xff0c;确保你的HTML文件中已经正确引入了B…

Vue学习:v-model绑定文本框、单选按钮、下拉菜单、复选框等

v-model指令可以在组件上使用以实现双向绑定&#xff0c;之前学习过v-model绑定文本框和下拉菜单&#xff0c;今天把表单的几个控件单选按钮radio、复选框checkbox、多行文本框textarea都试着绑定了一下。 一、单行文本框和多行文本框 <p>1.单行文本框</p> 用户名…

程序员日志之DNF编年史

目录 传送门正文日志1、概要2、超高度总结概括3、详细编年史3.1、大背景3.2、冒险家 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&…

YOLOv5改进 | 模块缝合 | C3 融合RFCAConv增强感受野空间特征 【二次融合 小白必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv5入门 改…

飞牛fnOS安装KDE桌面

飞牛fnOS安装KDE桌面 这段时间新出的nas系统飞牛os真不错&#xff0c;基于debian的可折腾性又高了不少&#xff0c;今天就来给这个系统装个桌面&#xff0c;插上显示器也能当个电脑自己进自己的管理界面&#xff0c;播放下视频&#xff0c;上上网啥的。 文章目录 飞牛fnOS安装…

问卷调查,动静IP应该如何选择?

在探讨问卷调查这一领域时&#xff0c;选择使用动态IP还是静态IP&#xff0c;成为了许多从业者及市场研究者面临的重要决策&#xff0c;它不仅关乎数据收集的效率与质量&#xff0c;还直接影响到问卷调查的合法性与安全性。本文将从多个维度深入分析这两种IP类型的优劣&#xf…

python-网页自动化(三)

如果遇到使用 ajax 加载的网页&#xff0c;页面元素可能不是同时加载出来的&#xff0c;这个时候尝试在 get 方法执行完 成时获取网页源代码可能并非浏览器完全加载完成的页面。所以&#xff0c;这种情况下需要设置延时等待一定时间&#xff0c;确保全部节点都加载出来。 那么&…

每日一练8:dd爱框框(含链接)

1.链接 登录—专业IT笔试面试备考平台_牛客网 2.题目 3.代码 #include<iostream> #include<vector>using namespace std;const int N 1e7 5;int n,x;vector<int> v(N);int main() {cin >> n >> x;for(int i 0; i < n;i) cin >> v…

服务端性能测试:行业流行性能监控工具介绍

行业流行性能监控工具有哪些 Linux 自带命令 Vmstat&#xff0c;Top 等 Nmon Collectd InfluxDB Grafana Prometheus Grafana 行业流行性能监控工具的介绍 Linux 自带命令 Vmstat&#xff0c;Top 等 vmstat 和 top 都是 Linux 系统自带的命令&#xff0c;提供了实时的…

每日一练:轮转数组

一、题目要求 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: …

hive时间函数

一、随机示例&#xff08;想到哪里写哪里&#xff09; 1.系统时间函数 查询 select current_timestamp --当前格式化时间,current_date --当前格式化日期,unix_timestamp() --当前unix时间戳 结果&#xff1a; 2.时间函数转换 查询 --将时间戳转化为格式化时间 sel…

微片水凝胶如何用于4D生物打印?快来了解一下!

大家好&#xff0c;今天我们来聊聊一项4D 活细胞生物打印技术——《Jammed Micro-Flake Hydrogel for 4D Living Cell Bioprinting》发表于《Advanced Materials》。在组织器官再生应用中&#xff0c;构建具有复杂几何形状和功能的载细胞结构至关重要。而水凝胶基4D生物墨水的发…

免费 U 盘数据恢复 - 用 4 种免费方法从随身U 盘恢复文件

如何在不使用软件的情况下从 USB 驱动器恢复已删除的文件&#xff1f;如何取消删除 USB 闪存驱动器&#xff1f;首先&#xff0c;不要对拇指驱动器进行任何进一步的更改。然后下载奇客数据恢复&#xff0c;这是一款免费的U 盘恢复工具&#xff0c;能够从各种问题中恢复笔式驱动…