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. 注意

  1. 数学坐标系和OpenCV的坐标系的Y轴相反,因此计算获得坐标点需要将Y轴取反;
  2. 计算坐标点是以五角星重心为原点,因此绘制时须根据实际情况移动原点。

OpenCV-Python实战(4) —— OpenCV 五角星各点在坐标系上面的坐标计算(以重心为原点)相关推荐

  1. Python实战案例:高血压项目详解(上)

    Python实战项目 高血压项目详解(上) 涉及内容:爬虫&开发&数学分析&数据挖掘 a.前端界面的技术--> Juqery Mobile (JQM),俗称"机 ...

  2. openCV+Python实战练习——银行卡号识别

    目录 项目Introduce: 项目名称: 具体操作步骤以及代码: 实现结果展示: 代码整体展示: 项目Introduce: 项目名称: 通过导入模板数字,对银行卡面上的数字进行识别,提取出银行卡面上 ...

  3. opencv+python实战日记 入门篇(八)色块识别

    色块识别 import cv2 import numpy as npframeWidth = 640 frameHeight = 480 cap = cv2.VideoCapture(0)#获取摄像头 ...

  4. opencv+python实战日记 入门篇(二)调整图片的尺寸、裁剪图像

    目录 调整图片的尺寸 裁剪图像 调整图片的尺寸 打印出来的(496, 488, 3)表示的是图片的长宽,3表示的是RGB通道. import cv2 import numpy as npimg = c ...

  5. opencv python考勤_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(二)

    一. 门禁考勤系统硬件设计 1 .硬件总体结构 PC端的intel处理器作为硬件平台的核心,是衡量系统能否达到标准的主要标志.本文结合考勤系统,采用intel i5处理器的PC与51单片机共同构建了门 ...

  6. python中坐标怎么表示_如何在Python中以像素表示(有限)平面上的坐标

    我假设你有十进制坐标,比如50.3869881,-4.6177269,南北优先.在 因为你有一个相当小的地图,我们不需要担心地球的曲率,我们可以假设我们有一个线性地图,所以地图上点的(x,y)坐标将是 ...

  7. Python使用PIL工具、ImageDraw函数在图像上根据坐标点依次连线画矩形框,可画选择倾斜的框和折线

    示例1,根据五个坐标画一个闭合的矩形框: img = Image.open(iamge_path) #打开图片1.jpg draw = ImageDraw.Draw(img) draw.line([( ...

  8. python算三角形面积怎么样保留两位小数_通过坐标计算三角形面积

    描述 平面上有一个三角形,它的三个顶点坐标分别为(x1, y1), (x2, y2), (x3, y3),那么请问这个三角形的面积是多少. 输入 输入仅一行,包括6个单精度浮点数,分别对应x1, y1 ...

  9. Python量化投资——投资组合的评价和可视化(上):计算收益率、波动率、最大回撤、阿尔法alpha、贝塔beta、夏普率Sharp等指标【源码+详解】

    投资组合的评价和可视化(上)--评价指标的计算 投资结果评价 本文示例数据下载 投资过程回顾 基于收益的投资组合评价 收益率.年化收益.每日收益率 月度历史收益率 基于风险度量的投资组合评价 Vola ...

最新文章

  1. mac文件夹中如何给文件重命名,快捷键是什么
  2. python有哪些软件包用来考察变量之间的相关性_Python计算数据相关系数(person、Kendall、spearman)...
  3. Thymeleaaf中设置属性值实现动态控制select是否可选
  4. Java——遍历List过程中添加和删除元素的问题(亲测第二种)
  5. JavaScript数据类型和变量学习小记
  6. [libGDX游戏开发教程]使用libGDX进行游戏开发(12)-Action动画
  7. 极大似然估计的渐进正态性
  8. python export_django-import-export插件使用教程
  9. 如何跟踪发现Linux内核补丁(patch)
  10. 五分钟带你了解前端开发,以及前端开发的发展机会
  11. day34-2 类和对象(重点)
  12. Java面试题和答案
  13. CentOS+NodeJS环境
  14. 物流 计算机管理 好处,物流配送管理系统的好处与可行性分析
  15. 分析、归纳、综合、演绎
  16. Git 奇淫技巧:Github ID 更名奇遇记
  17. ADXL345测量角度
  18. 数字摄影测量考试复习名词解释
  19. 安卓高仿京东淘宝的筛选功能,全网最简单方便
  20. 管廊隧道怎么定位人员?分享管廊隧道人员定位系统解决方案

热门文章

  1. 数据结构与算法A实验六图论(C语言参考代码)
  2. 传奇私服架设(温故2002,自己制作传奇私服服务器)
  3. mysql清除字符空格_mysql清除数据库中字符串空格方法
  4. 2008年度技术奥斯卡大奖:The Crunchies 2008 现场报导
  5. RBA验厂咨询,RBA认证6.0有哪三个章节名称调整及行为准则改变要点说明
  6. 【生活智慧】009.时间就是金钱
  7. 心路历程(一)--天圆地方的时候
  8. 浙江交通基础信息应用平台及公路信息管理系统建设项目
  9. AndroidStudio实现相机拍照或从相册中选取照片并显示
  10. ORA-16032: parameter LOG_ARCHIVE_DEST_3 destination string cannot be translated问题处理过程