OpenCV-Python实战(4) —— OpenCV 五角星各点在坐标系上面的坐标计算(以重心为原点)
1. 创建坐标系
2. 角度计算
注意: AO⊥BE !!!
2.1 五个角的度数
∠GAF = ∠FBG = ∠GCH = ∠HDK = ∠KEG = 36°
2.2 五个角对应的原点度数
∠GOF = ∠FOG = ∠GOH = ∠HOK = ∠KOG = 360° / 5 = 72°
2.3 计算与x轴夹角度数
∠AOX = 90°
∠GOF = 72°
∠FOB = 36°
∠BOX = 90° - 72° = 18°
∠GOX = ∠KOX = 36° - 18° = 18°
∠COX = ∠DOX = 36° + 18° = 54°
∠FOX = 36° + 18° = 54°
3 计算各个线段的长度
假设 OA = r !!!
3.1 计算 OF 长度
因为:
∠BOX = 90° - 72° = 18°
∠FOA = 36°
OB = r
所以:
pi_val = np.pi / 180
OF * np.cos(36 * pi_val) = OB * np.sin(18 * pi_val)
OF = min_r = (r * np.sin(18 * pi_val)) / np.cos(36 * pi_val)
4. 各点坐标表示
# 外五边形的坐标
A(0,r)
B(r * np.cos(18 * pi_val), r * np.sin(18 * pi_val))
C(r * np.cos(54 * pi_val), - r * np.sin(54 * pi_val))
D(- r * np.cos(54 * pi_val), - r * np.sin(54 * pi_val))
E(- r * np.cos(18 * pi_val), r * np.sin(18 * pi_val))
# 内五边形的坐标
F(min_r * np.cos(54 * pi_val),min_r * np.sin(54 * pi_val))
G(min_r * np.cos(18 * pi_val),- min_r * np.sin(18 * pi_val))
H(0, - min_r)
K(- min_r * np.cos(18 * pi_val),- min_r * np.sin(18 * pi_val))
G(- min_r * np.cos(54 * pi_val),min_r * np.sin(54 * pi_val))
5. 根据计算的点绘制上边坐标系
5.1 实现代码
import cv2 as cv
import numpy as np# 使用 **arrowedLine** 箭头线创建坐标系
def create_coordinate(mat):h,w,c = mat.shapehalf_h = int(h / 2)half_w = int(w / 2)# 绘制x轴ptsx1 = (10, half_h)ptsx2 = (w - 10, half_h)cv.arrowedLine(mat,ptsx1,ptsx2,(0,0,0),tipLength=0.03)cv.putText(mat,'x',(w - 25, half_h + 25), cv.FONT_HERSHEY_SIMPLEX, 1, (0,0,0))# 绘制y轴ptsy1 = (half_w, h - 10)ptsy2 = (half_w, 10)cv.arrowedLine(mat,ptsy1,ptsy2,(0,0,0),tipLength=0.03)cv.putText(mat,'y',(half_w + 10, 25), cv.FONT_HERSHEY_SIMPLEX, 1, (0,0,0))# 绘制原点和坐标cv.putText(mat,'O(0,0)',(half_w, half_h - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))return mat# 以五角星的重心为原点,计算各点坐标
def get_star_point(r = 100):# 计算没一份的度数和内五边形的rpi_val = np.pi / 180min_r = r * np.sin(18 * pi_val) / np.cos(36 * pi_val)# 外五边形的坐标a = [0,r]b = [r * np.cos(18 * pi_val), r * np.sin(18 * pi_val)]c = [r * np.cos(54 * pi_val), - r * np.sin(54 * pi_val)]d = [- r * np.cos(54 * pi_val), - r * np.sin(54 * pi_val)]e = [- r * np.cos(18 * pi_val), r * np.sin(18 * pi_val)]# 内五边形的坐标in_a = [min_r * np.cos(54 * pi_val),min_r * np.sin(54 * pi_val)]in_b = [min_r * np.cos(18 * pi_val),- min_r * np.sin(18 * pi_val)]in_c = [0, - min_r]in_d = [- min_r * np.cos(18 * pi_val),- min_r * np.sin(18 * pi_val)]in_e = [- min_r * np.cos(54 * pi_val),min_r * np.sin(54 * pi_val)]return {"out": [a, b, c, d, e],"in": [in_a, in_b, in_c, in_d, in_e]}def tagging_points(img):# 获取五角星各个坐标点points = get_star_point()# 获取内外五边形的各点坐标[a,b,c,d,e] = list(map(lambda items: [int(items[0]),-int(items[1])], points.get("out")))[in_a,in_b,in_c,in_d,in_e] = list(map(lambda items: [int(items[0]),-int(items[1])], points.get("in")))cv.putText(img,f'A',(a[0] + 200, a[1] + 200), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'B',(b[0] + 200, b[1] + 200 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'C',(c[0] + 200, c[1] + 200 + 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'D',(d[0] + 200, d[1] + 200 + 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'E',(e[0] + 200, e[1] + 200 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'F',(in_a[0] + 200, in_a[1] + 200 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'G',(in_b[0] + 200, in_b[1] + 200 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'H',(in_c[0] + 200, in_c[1] + 200 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'K',(in_d[0] + 200, in_d[1] + 200 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))cv.putText(img,f'G',(in_e[0] + 200, in_e[1] + 200 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0))return img# 绘制五角星
def create_star(img):# 获取五角星各个坐标点points = get_star_point()# 获取内外五边形的各点坐标[a,b,c,d,e] = list(map(lambda items: [int(items[0]),-int(items[1])], points.get("out")))[in_a,in_b,in_c,in_d,in_e] = list(map(lambda items: [int(items[0]),-int(items[1])], points.get("in")))# 设置原点坐标o = [0,0]# 设置多边形点pts = np.array([o,a,in_a,o,in_a,b,o,b,in_b,o,in_b,c,o,c,in_c,o,in_c,d,o,d,in_d,o,in_d,e,o,e,in_e,o,in_e,a,o])# 由于图片宽度400,设置原点(200,200)pts[:,:] += 200cv.polylines(img, [pts], True, (0,0,0),1)return imgdef create_demo():img = np.ones((400,400,3),np.uint8)*255# 绘制坐标系img = create_coordinate(img)# 绘制五角星img = create_star(img)# 标注各点img = tagging_points(img)cv.imshow("coordinate", img)cv.waitKey(0)cv.destroyAllWindows()if __name__ == "__main__":create_demo()
5.2 结果
6. 注意
- 数学坐标系和OpenCV的坐标系的Y轴相反,因此计算获得坐标点需要将Y轴取反;
- 计算坐标点是以五角星重心为原点,因此绘制时须根据实际情况移动原点。
OpenCV-Python实战(4) —— OpenCV 五角星各点在坐标系上面的坐标计算(以重心为原点)相关推荐
- Python实战案例:高血压项目详解(上)
Python实战项目 高血压项目详解(上) 涉及内容:爬虫&开发&数学分析&数据挖掘 a.前端界面的技术--> Juqery Mobile (JQM),俗称"机 ...
- openCV+Python实战练习——银行卡号识别
目录 项目Introduce: 项目名称: 具体操作步骤以及代码: 实现结果展示: 代码整体展示: 项目Introduce: 项目名称: 通过导入模板数字,对银行卡面上的数字进行识别,提取出银行卡面上 ...
- opencv+python实战日记 入门篇(八)色块识别
色块识别 import cv2 import numpy as npframeWidth = 640 frameHeight = 480 cap = cv2.VideoCapture(0)#获取摄像头 ...
- opencv+python实战日记 入门篇(二)调整图片的尺寸、裁剪图像
目录 调整图片的尺寸 裁剪图像 调整图片的尺寸 打印出来的(496, 488, 3)表示的是图片的长宽,3表示的是RGB通道. import cv2 import numpy as npimg = c ...
- opencv python考勤_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(二)
一. 门禁考勤系统硬件设计 1 .硬件总体结构 PC端的intel处理器作为硬件平台的核心,是衡量系统能否达到标准的主要标志.本文结合考勤系统,采用intel i5处理器的PC与51单片机共同构建了门 ...
- python中坐标怎么表示_如何在Python中以像素表示(有限)平面上的坐标
我假设你有十进制坐标,比如50.3869881,-4.6177269,南北优先.在 因为你有一个相当小的地图,我们不需要担心地球的曲率,我们可以假设我们有一个线性地图,所以地图上点的(x,y)坐标将是 ...
- Python使用PIL工具、ImageDraw函数在图像上根据坐标点依次连线画矩形框,可画选择倾斜的框和折线
示例1,根据五个坐标画一个闭合的矩形框: img = Image.open(iamge_path) #打开图片1.jpg draw = ImageDraw.Draw(img) draw.line([( ...
- python算三角形面积怎么样保留两位小数_通过坐标计算三角形面积
描述 平面上有一个三角形,它的三个顶点坐标分别为(x1, y1), (x2, y2), (x3, y3),那么请问这个三角形的面积是多少. 输入 输入仅一行,包括6个单精度浮点数,分别对应x1, y1 ...
- Python量化投资——投资组合的评价和可视化(上):计算收益率、波动率、最大回撤、阿尔法alpha、贝塔beta、夏普率Sharp等指标【源码+详解】
投资组合的评价和可视化(上)--评价指标的计算 投资结果评价 本文示例数据下载 投资过程回顾 基于收益的投资组合评价 收益率.年化收益.每日收益率 月度历史收益率 基于风险度量的投资组合评价 Vola ...
最新文章
- mac文件夹中如何给文件重命名,快捷键是什么
- python有哪些软件包用来考察变量之间的相关性_Python计算数据相关系数(person、Kendall、spearman)...
- Thymeleaaf中设置属性值实现动态控制select是否可选
- Java——遍历List过程中添加和删除元素的问题(亲测第二种)
- JavaScript数据类型和变量学习小记
- [libGDX游戏开发教程]使用libGDX进行游戏开发(12)-Action动画
- 极大似然估计的渐进正态性
- python export_django-import-export插件使用教程
- 如何跟踪发现Linux内核补丁(patch)
- 五分钟带你了解前端开发,以及前端开发的发展机会
- day34-2 类和对象(重点)
- Java面试题和答案
- CentOS+NodeJS环境
- 物流 计算机管理 好处,物流配送管理系统的好处与可行性分析
- 分析、归纳、综合、演绎
- Git 奇淫技巧:Github ID 更名奇遇记
- ADXL345测量角度
- 数字摄影测量考试复习名词解释
- 安卓高仿京东淘宝的筛选功能,全网最简单方便
- 管廊隧道怎么定位人员?分享管廊隧道人员定位系统解决方案
热门文章
- 数据结构与算法A实验六图论(C语言参考代码)
- 传奇私服架设(温故2002,自己制作传奇私服服务器)
- mysql清除字符空格_mysql清除数据库中字符串空格方法
- 2008年度技术奥斯卡大奖:The Crunchies 2008 现场报导
- RBA验厂咨询,RBA认证6.0有哪三个章节名称调整及行为准则改变要点说明
- 【生活智慧】009.时间就是金钱
- 心路历程(一)--天圆地方的时候
- 浙江交通基础信息应用平台及公路信息管理系统建设项目
- AndroidStudio实现相机拍照或从相册中选取照片并显示
- ORA-16032: parameter LOG_ARCHIVE_DEST_3 destination string cannot be translated问题处理过程