cv2.fitEllipse函数详解:ellipse参数并根据参数计算出椭圆焦点坐标
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参数并根据参数计算出椭圆焦点坐标相关推荐
- OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比
☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.概述 在<OpenCV-Python图像的加法运算cv2.add函数详解> ...
- python中减法运算函数_OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减...
OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减 OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比 ? ? 前往老猿 ...
- opencv 二值化 python_opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用...
cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...
- opencv 二值化 matlab,opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH...
cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...
- opencv学习笔记五:cv2.warpAffine()函数详解
cv2.warpAffine()函数主要是利用变换矩阵M对图像进行如旋转.仿射.平移等变换,只需要我们提供一个2*3的变换矩阵M,就可以对图像进行变换.它一般是和cv2.getRotationMatr ...
- cv2.minAreaRect函数详解
一.cv2.minAreaRect函数作⽤:返回不规则四边形的最⼩外接矩形 二.opencv4.2版本: 1.输入:多边形轮廓形点 2.输出:最⼩外接矩形的中⼼点坐标x,y,宽⾼w,h,⾓度anlge ...
- OpenCV-Python图像的加法运算cv2.add函数详解
☞ ░ 前往老猿Python博文目录 ░ 一.加法概述 图像加法主要有两种用途,一种是可用于减少甚至消除图像采集中混入的噪声,由于图像各点的采集噪声是互不相关的,且噪声具有零均值的统计特性,因此可以对 ...
- mysql capi函数详解_技术分享|MySQLCAPI参数MYSQL_OPT_READ_TIMEOUT的一些行为分析
作者:戴岳兵 MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数.在 MySQL 的官方文档中,该参数的描述是这样的: MYSQL_OPT_R ...
- cv2.contourArea函数详解
问题:cv2.findContours找到所有的轮廓之后,想取出包含面积最大的轮廓,用cv2.contourArea算一下,但是得到的结果跟实际差别相当大,最大轮廓面积的计算成很小的一个值,而其中一个 ...
最新文章
- Linux常用指令收集
- 数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】
- PYMODM使用记录
- 你需要知道的css布局
- 背景透明,文字不透明效果
- 张东:大数据时代挑战与解决之道
- html5 crop,HTML5内联SVG autocrop空格
- 小牛性能服务器图片,【N1S参数篇】性能与体验并肩,N1S参数配置介绍
- Unity3D游戏资源的提取
- 凸优化1——仿射集、凸集、锥
- python实现英文新闻摘要自动提取_利用Python实现摘要自动提取,完美瘦身只需一行代码...
- Android中的接口的使用举例
- 常用的但是容易忘记的css样式..........持续更新,主要自用
- 正则表达式—————根据银行卡号判断银行名称
- mysql初始化后启动失败_初始化MySQL后服务不能正常启动
- 通俗易懂:什么是.NET?.NET Framework?.NET Core?(比较全面)
- Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException
- Java面试题中高级,nasdocker有啥好玩的
- 多层卷积后感受野的计算
- 硬盘引导二合一安装黑群晖