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

最近因为用到了这个函数,所以就趁着这个机会,好好顺顺,做下记录。

ellipse = cv2.fitEllipse(cnt)#(x, y), (a, b), angle = cv2.fitEllipse(cnt)
#ellipse =  [ (x, y) , (a, b), angle ]

ellipse 为元组类型,其里面的参数为:

  • (x, y)代表椭圆中心点的位置
  • (a, b)代表长短轴长度,应注意a、b为长短轴的直径,而非半径
    angle 代表了中心旋转的角度

椭圆参数角度效果

旋转30°

旋转60°

旋转90°

旋转120°

旋转150°

旋转180°

旋转210°

从上图看应该是旋转180°以内和180°到360°是一样的。

椭圆焦点坐标的计算

对于一个旋转60°椭圆,如下:

则根据高中数学知识易得:

根据上图和其他参数,可以很简单的用下面的代码计算出来点的坐标:


计算代码如下:

#画长宽
res_ellipse = ((150,140),(150,100),60)
ell_center_x = int(res_ellipse[0][0])
ell_center_y = int(res_ellipse[0][1])ell_h_point1_x = int(ell_center_x - 0.5 * res_ellipse[1][0] * math.cos(res_ellipse[2]/ 180 * math.pi))
ell_h_point1_y = int(ell_center_y - 0.5 * res_ellipse[1][0]* math.sin(res_ellipse[2]/ 180 * math.pi))
ell_h_point2_x = int(ell_center_x + 0.5 * res_ellipse[1][0] * math.cos(res_ellipse[2]/ 180 * math.pi))
ell_h_point2_y = int(ell_center_y + 0.5 * res_ellipse[1][0]* math.sin(res_ellipse[2]/ 180 * math.pi))ell_w_point1_x = int(ell_center_x - 0.5 * res_ellipse[1][1] * math.sin(res_ellipse[2]/ 180 * math.pi))
ell_w_point1_y = int(ell_center_y + 0.5 * res_ellipse[1][1]* math.cos(res_ellipse[2]/ 180 * math.pi))
ell_w_point2_x = int(ell_center_x + 0.5 * res_ellipse[1][1] * math.sin(res_ellipse[2]/ 180 * math.pi))
ell_w_point2_y = int(ell_center_y - 0.5 * res_ellipse[1][1]* math.cos(res_ellipse[2]/ 180 * math.pi))cv2.line(img,(ell_h_point1_x,ell_h_point1_y),(ell_h_point2_x,ell_h_point2_y),(0,255,255),thickness=2)
cv2.line(img,(ell_w_point1_x,ell_w_point1_y),(ell_w_point2_x,ell_w_point2_y),(0,255,255),thickness=2)

最终效果图:

对于角度为240°(180+60)的椭圆,计算效果如下:

可以看出来没有影响。

完整代码如下:

其中"black.png“ 就是我随便截取的一个黑色背景。

import os
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
import cv2
from PIL import ImageEnhance
import math
def cv_show(name,file):cv2.imshow(name, file)cv2.waitKey(0)cv2.destroyAllWindows()
# 椭圆参数的计算img = cv2.imread("black.png")
#cv_show("res",img)
cv2.ellipse(img, ((150,140),(150,100),60), (0, 255, 0), 2)cv_show("res",img)
#画长宽res_ellipse = ((150,140),(150,100),60)
ell_center_x = int(res_ellipse[0][0])
ell_center_y = int(res_ellipse[0][1])ell_h_point1_x = int(ell_center_x - 0.5 * res_ellipse[1][0] * math.cos(res_ellipse[2]/ 180 * math.pi))
ell_h_point1_y = int(ell_center_y - 0.5 * res_ellipse[1][0]* math.sin(res_ellipse[2]/ 180 * math.pi))
ell_h_point2_x = int(ell_center_x + 0.5 * res_ellipse[1][0] * math.cos(res_ellipse[2]/ 180 * math.pi))
ell_h_point2_y = int(ell_center_y + 0.5 * res_ellipse[1][0]* math.sin(res_ellipse[2]/ 180 * math.pi))ell_w_point1_x = int(ell_center_x - 0.5 * res_ellipse[1][1] * math.sin(res_ellipse[2]/ 180 * math.pi))
ell_w_point1_y = int(ell_center_y + 0.5 * res_ellipse[1][1]* math.cos(res_ellipse[2]/ 180 * math.pi))
ell_w_point2_x = int(ell_center_x + 0.5 * res_ellipse[1][1] * math.sin(res_ellipse[2]/ 180 * math.pi))
ell_w_point2_y = int(ell_center_y - 0.5 * res_ellipse[1][1]* math.cos(res_ellipse[2]/ 180 * math.pi))cv2.line(img,(ell_h_point1_x,ell_h_point1_y),(ell_h_point2_x,ell_h_point2_y),(0,255,255),thickness=2)
cv2.line(img,(ell_w_point1_x,ell_w_point1_y),(ell_w_point2_x,ell_w_point2_y),(0,255,255),thickness=2)cv_show("res_img",img)

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

  1. OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.概述 在<OpenCV-Python图像的加法运算cv2.add函数详解> ...

  2. python中减法运算函数_OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减...

    OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减 OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比 ? ? 前往老猿 ...

  3. opencv 二值化 python_opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用...

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  4. opencv 二值化 matlab,opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH...

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  5. opencv学习笔记五:cv2.warpAffine()函数详解

    cv2.warpAffine()函数主要是利用变换矩阵M对图像进行如旋转.仿射.平移等变换,只需要我们提供一个2*3的变换矩阵M,就可以对图像进行变换.它一般是和cv2.getRotationMatr ...

  6. cv2.minAreaRect函数详解

    一.cv2.minAreaRect函数作⽤:返回不规则四边形的最⼩外接矩形 二.opencv4.2版本: 1.输入:多边形轮廓形点 2.输出:最⼩外接矩形的中⼼点坐标x,y,宽⾼w,h,⾓度anlge ...

  7. OpenCV-Python图像的加法运算cv2.add函数详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.加法概述 图像加法主要有两种用途,一种是可用于减少甚至消除图像采集中混入的噪声,由于图像各点的采集噪声是互不相关的,且噪声具有零均值的统计特性,因此可以对 ...

  8. mysql capi函数详解_技术分享|MySQLCAPI参数MYSQL_OPT_READ_TIMEOUT的一些行为分析

    作者:戴岳兵 MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数.在 MySQL 的官方文档中,该参数的描述是这样的: MYSQL_OPT_R ...

  9. cv2.contourArea函数详解

    问题:cv2.findContours找到所有的轮廓之后,想取出包含面积最大的轮廓,用cv2.contourArea算一下,但是得到的结果跟实际差别相当大,最大轮廓面积的计算成很小的一个值,而其中一个 ...

最新文章

  1. Linux常用指令收集
  2. 数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】
  3. PYMODM使用记录
  4. 你需要知道的css布局
  5. 背景透明,文字不透明效果
  6. 张东:大数据时代挑战与解决之道
  7. html5 crop,HTML5内联SVG autocrop空格
  8. 小牛性能服务器图片,【N1S参数篇】性能与体验并肩,N1S参数配置介绍
  9. Unity3D游戏资源的提取
  10. 凸优化1——仿射集、凸集、锥
  11. python实现英文新闻摘要自动提取_利用Python实现摘要自动提取,完美瘦身只需一行代码...
  12. Android中的接口的使用举例
  13. 常用的但是容易忘记的css样式..........持续更新,主要自用
  14. 正则表达式—————根据银行卡号判断银行名称
  15. mysql初始化后启动失败_初始化MySQL后服务不能正常启动
  16. 通俗易懂:什么是.NET?.NET Framework?.NET Core?(比较全面)
  17. Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException
  18. Java面试题中高级,nasdocker有啥好玩的
  19. 多层卷积后感受野的计算
  20. 硬盘引导二合一安装黑群晖

热门文章

  1. 02云计算与大数据学习之大数据关键技术与应用习题
  2. 常用flash引擎和框架
  3. 基于pytorch的文本情感识别(LSTM,CNN)
  4. 【BABY夜谈大数据】计算文本相似度
  5. 推荐一个好用的PDF转TXT软件
  6. ST-GCN的学习之路(一)论文分析
  7. 天吴系统2.0上线,金柚网提升HR服务价值
  8. 关于 Goby 红队专版获取指南!
  9. wifi大师小程序专业版源码小程序源码内含教程
  10. pr联动me批量导出子剪辑操作