转载:https://blog.csdn.net/sinat_31425585/article/details/75103239?utm_source=blogxgwz0

使用OpenCV的fitEllipse函数拟合椭圆后,会得到一个RotatedRect类型的返还值,首先介绍一下RotatedRect结构,这个参考的无左无右的博客:点击打开链接,嫌左右跳麻烦,所以直接贴过来

class CV_EXPORTS RotatedRect
{   public:  //构造函数
      RotatedRect();
    RotatedRect(const Point2f& center, const Size2f& size, float angle);
    RotatedRect(const CvBox2D& box);
    void points(Point2f pts[]) const;    //!返回矩形的4个顶点
       Rect boundingRect() const;  //返回包含旋转矩形的最小矩形
   operator CvBox2D() const;  //!转换到旧式的cvbox2d结构
   Point2f center; //矩形的质心
   Size2f size;    //矩形的边长
    float angle;    //旋转角度,当角度为0、90、180、270等时,矩形就成了一个直立的矩形
};
 需要注意的是angle对应角度是角度,如果使用三角函数sin,cos,tan之类的需要先转换成弧度,boundingRect对应水平方向外接矩形而不是椭圆的外接矩形,如果需要获取椭圆的两个半轴长度可以通过size.width和size.height得到,其余的参数看一下上面代码对应注释.

下面就是怎么通过一个RotatedRect来获取椭圆参数,具体原理可以参考百度文库的一个文档:点击打开链接,直接截图看一下:

因为这里默认的是顺时针旋转为正,而图像里面默认是逆时针旋转为正,只需要把B乘以一个负号就行,感兴趣的同学自己推导一下.

好了,到了上代码的时间了,代码如下:

#include <opencv2//opencv.hpp>
#include <iostream>
#include <math.h>
 
 
using namespace cv;
using namespace std;
 
 
struct EllipsePara
{
    Point2f c;
    float A;
    float B;
    float C;
    float F;
};

void getEllipsePara(RotatedRect & ellipsemege, EllipsePara& EP_t)
{
    
 
    float theta = ellipsemege.angle * CV_PI / 180.0 ;
    float a = ellipsemege.size.width / 2.0;
    float b = ellipsemege.size.height / 2.0;
 
    EP_t.c.x = ellipsemege.center.x;
    EP_t.c.y = ellipsemege.center.y;
 
    EP_t.A = a * a * sin(theta) * sin(theta) + b * b * cos(theta) * cos(theta);
    EP_t.B = (-2.0) * (a * a - b * b) * sin(theta) * cos(theta);
    EP_t.C = a * a * cos(theta) * cos(theta) + b * b * sin(theta) * sin(theta);
    EP_t.F = (-1.0) * a * a * b * b;
 
 
    //cout << "theta: " << theta << " x: " << EP.c.x << " y: " << EP.c.y << " C: " << EP.C << " F: " << EP.F << endl;
 
 
}
void main()
{
    //RotatedRect(const Point2f& center, const Size2f& size, float angle);  
    RotatedRect Rec_t = RotatedRect(Point2f(0,0), Size2f(4,1), 90);
    cout << Rec_t.size.width << " " << Rec_t.size.height << endl;
 
    cout << Rec_t.boundingRect().width <<  " " << Rec_t.boundingRect().height <<  endl;
    EllipsePara EP_t;
    getEllipsePara(Rec_t, EP_t);
 
    cout << EP_t.A << " " << EP_t.B << " " << EP_t.C << " " << EP_t.F << endl;
    
    
 
 
}
得到的椭圆方程为:

OpencV使用fitEllipse拟合椭圆后,获取椭圆参数相关推荐

  1. java grabcut,在OpenCV中应用GrabCut算法后获取相同的图像

    我使用GrabCut算法来分割我的图像my image,以检测我图像中的柑橘(水果)作为前景并从背景中减去它 . 为此,首先我必须在我的对象(水果)周围选择2个点,用于在我的对象(水果)周围绘制矩形, ...

  2. PHP关闭$_ENV后获取服务器参数的办法

    为什么80%的码农都做不了架构师?>>>    <?php header('Content-type:text/html;charset=utf-8'); print_r($_ ...

  3. 【OpenCV 例程300篇】214. 绘制椭圆的参数详解

    OpenCV 例程200篇 总目录 [youcans 的 OpenCV 例程300篇]214. 绘制椭圆的参数详解 OpenCV提供了绘图功能,可以在图像上绘制直线.矩形.圆.椭圆等各种几何图形. 7 ...

  4. cv2.fitEllipse函数详解:ellipse参数并根据参数计算出椭圆焦点坐标

    cv2.fitEllipse函数详解:ellipse参数并根据参数计算出椭圆焦点坐标 最近因为用到了这个函数,所以就趁着这个机会,好好顺顺,做下记录. ellipse = cv2.fitEllipse ...

  5. python用函数绘制椭圆_详解opencv中画圆circle函数和椭圆ellipse函数

    1. void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, doub ...

  6. 标准椭圆和任意椭圆方程之间的变换公式推导

    我们在高中数学中就学习过标准的椭圆方程如下:x2a2+y2b2=1\frac{x^2}{a^2}+\frac{y^2}{b^2}=1a2x2​+b2y2​=1这个方程表示一个中心在坐标原点.长轴延xx ...

  7. wpf浏览器应用程序发布后获取当前应用地址

    AppDomain.CurrentDomain.ApplicationIdentity.CodeBase   获取作为URL的部署清单的位置 Eg:发布前地址为E:\PROJECTWORK\Landa ...

  8. python执行系统命令后获取返回值的几种方式集合

    第一种情况 os.system('ps aux') 执行系统命令,没有返回值 第二种情况 result = os.popen('ps aux') res = result.read() for lin ...

  9. 椭圆中心到椭圆切线的距离

    本文将要讨论的是椭圆中心到椭圆切线的距离公式,在求这个距离之前,我们首先要知道两个定理. 定理1:椭圆 上的点到椭圆左,右焦点的距离分别是和,其中是椭圆的离心率. 定理2:椭圆(1)上的点处的切线方程 ...

  10. Mybatis插入数据后获取主键的值

    Mybatis插入数据后获取主键的值 1. 所使用的数据库是支持自增的,且主键是自增的 <!-- 支持自增的数据库且主键是自增的:自动将插入后自增id的值赋值给传入的Employee的id--& ...

最新文章

  1. 【CV】Pytorch一小时教程添加损失函数图像可视化训练过程
  2. 一堆棋子java代码编程_网易2018校招内推编程题-堆棋子-C++实现
  3. 文本间加入任意字符的PHP函数
  4. Maven projects need to be imported反复弹出如何办?
  5. JEECG商业版本授权说明(仅限企业用户)
  6. 提示账户不被允许使用docker的情况
  7. 大佬是如何实现本地通讯的?
  8. 教育版AutoCAD下载开启,你知道吗?
  9. centos7安装tomcat8
  10. 人口增长模型——基于matlab语言
  11. 2007中国优秀手机客户端软件和无线互联网
  12. Limesdr软件无线电架构的理解
  13. basler相机详细使用说明
  14. 中国海外文物拍卖天价
  15. 网络时钟同步系统概述
  16. 自适应网页(响应式布局)+弹性布局
  17. 多伦多大学朱子宁:一种选择语言探针的信息论观点
  18. 苹果屏保壁纸_神经病手势时钟-手势数字时钟app下载android安卓版ios苹果版
  19. JZOJ1496 页
  20. 资深办公室人员搞定数字转换Excel的精品秘诀

热门文章

  1. js高级学习笔记(b站尚硅谷)-15-闭包的剩余知识
  2. 输出分组_数据科学|pandas教程--分组和聚合
  3. mysql 窗口函数_MySQL-窗函数
  4. 根据ip地址制作html,根据ip掩码计算可用ip
  5. 故障恢复 stm32_77条STM32知识,千万不能错过!干货
  6. mysql_分组查询
  7. Java学习笔记之设计模式(6)观察者模式
  8. 00_kubernetes组件版本和配置策略
  9. (10)二进制文件方式部署Kubernetes高可用集群----------部署node节点
  10. 使用XMLHttpRequest