python基于opencv 实现图像时钟


Posted in Python onJanuary 04, 2021

解决方案详解

python基于opencv 实现图像时钟

绘制表盘

表盘上只有60条分/秒刻线和12条小时刻线,当然还有表盘的外部轮廓圆,也就是重点在如何画72根线。先把简单的圆画出来:

import cv2 as cv
import math
import datetime
import numpy as np

margin = 5 # 上下左右边距
radius = 220 # 圆的半径
center = (center_x, center_y) = (225, 225) # 圆心

# 1. 新建一个画板并填充成白色
img = np.zeros((450, 450, 3), np.uint8)
img[:] = (255, 255, 255)

# 2. 画出圆盘
cv.circle(img, center, radius, (0, 0, 0), thickness=5)

我们使用OpenCV画直线的时候,需知道直线的起点和终点坐标,那么画72根线就变成了获取72组坐标。
平面坐标系下,已知半径和角度的话,A点的坐标可以表示为:
x=r×cosα
y=r×sinα

python基于opencv 实现图像时钟

先只考虑将坐标系原点移动到左上角,角度依然是平面坐标系中的逆时针计算,那么新坐标是:
x=r+r×cosα
y=r+r×sinα
对于60条分/秒刻线,刻线间的夹角是360°/60=6°,对于小时刻线,角度是360°/12=30°,这样就得到了72组起点坐标,那怎么得到终点坐标呢?其实同样的原理,用一个同心的小圆来计算得到B点:

python基于opencv 实现图像时钟

通过A/B两点就可以画出直线:

pt1 = []

# 3. 画出60条秒和分钟的刻线
for i in range(60):
  # 最外部圆,计算A点
  x1 = center_x+(radius-margin)*math.cos(i*6*np.pi/180.0)
  y1 = center_y+(radius-margin)*math.sin(i*6*np.pi/180.0)
  pt1.append((int(x1), int(y1)))

  # 同心小圆,计算B点
  x2 = center_x+(radius-15)*math.cos(i*6*np.pi/180.0)
  y2 = center_y+(radius-15)*math.sin(i*6*np.pi/180.0)

  cv.line(img, pt1[i], (int(x2), int(y2)), (0, 0, 0), thickness=2)

# 4. 画出12条小时的刻线
for i in range(12):
  # 12条小时刻线应该更长一点
  x = center_x+(radius-25)*math.cos(i*30*np.pi/180.0)
  y = center_y+(radius-25)*math.sin(i*30*np.pi/180.0)
  # 这里用到了前面的pt1
  cv.line(img, pt1[i*5], (int(x), int(y)), (0, 0, 0), thickness=5)


# 到这里基本的表盘图就已经画出来了

python基于opencv 实现图像时钟

角度换算

接下来算是一个小难点,首先时钟的起始坐标在正常二维坐标系的90°方向,其次时钟跟图像一样,都是顺时针计算角度的,所以三者需要统一下:

python基于opencv 实现图像时钟

因为角度是完全对称的,顺逆时针没有影响,所以平面坐标系完全不用理会,放在这里只是便于大家理解。对于时钟坐标和图像坐标,时钟0的0°对应图像的270°,时钟15的90°对应图像的360°,时钟30的180°对应图像的450°(360°+90°)…
所以两者之间的关系便是:
计算角度 = 时钟角度+270°
计算角度 = 计算角度 if 计算角度<=360° else 计算角度-360°

同步时间

Python中如何获取当前时间和添加日期文字都比较简单,看代码就行,我就不解释了。

while(1):
  # 不断拷贝表盘图,才能更新绘制,不然会重叠在一起
  temp = np.copy(img)

  # 5. 获取系统时间,画出动态的时-分-秒三条刻线
  now_time = datetime.datetime.now()
  hour, minute, second = now_time.hour, now_time.minute, now_time.second

  # 画秒刻线
  # 参见博客,OpenCV中的角度是顺时针计算的,所以需要转换下
  sec_angle = second*6+270 if second <= 15 else (second-15)*6
  sec_x = center_x+(radius-margin)*math.cos(sec_angle*np.pi/180.0)
  sec_y = center_y+(radius-margin)*math.sin(sec_angle*np.pi/180.0)
  cv.line(temp, center, (int(sec_x), int(sec_y)), (255, 0, 0), 2)

  # 画分刻线
  min_angle = minute*6+270 if minute <= 15 else (minute-15)*6
  min_x = center_x+(radius-35)*math.cos(min_angle*np.pi/180.0)
  min_y = center_y+(radius-35)*math.sin(min_angle*np.pi/180.0)
  cv.line(temp, center, (int(min_x), int(min_y)), (0, 255, 0), 8)

  # 画时刻线
  hour_angle = hour*30+270 if hour <= 3 else (hour-3)*30
  hour_x = center_x+(radius-75)*math.cos(hour_angle*np.pi/180.0)
  hour_y = center_y+(radius-75)*math.sin(hour_angle*np.pi/180.0)
  cv.line(temp, center, (int(hour_x), int(hour_y)), (0, 0, 255), 20)

  # 6. 添加当前日期文字
  font = cv.FONT_HERSHEY_SIMPLEX
  time_str = now_time.strftime("%d/%m/%Y")
  cv.putText(img, time_str, (135, 275), font, 1, (0, 0, 0), 2)

  cv.imshow('clocking', temp)
  if cv.waitKey(1) == 27: # 按下ESC键退出
    break

python基于opencv 实现图像时钟

以上就是python基于opencv 实现图像时钟的详细内容,更多关于python opencv 实现图像时钟的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python字符串连接方法分析
Apr 12 Python
Python处理JSON数据并生成条形图
Aug 05 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
python datetime中strptime用法详解
Aug 29 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
Python中对象的比较操作==和is区别详析
Feb 12 Python
Python数据分析之pandas函数详解
Apr 21 Python
python基于opencv实现人脸识别
Jan 04 #Python
利用python绘制正态分布曲线
Jan 04 #Python
Python 打印自己设计的字体的实例讲解
Jan 04 #Python
Python关于拓扑排序知识点讲解
Jan 04 #Python
Python经典五人分鱼实例讲解
Jan 04 #Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 #Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 #Python
You might like
php模板函数 正则实现代码
2012/10/15 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
如何使用angularJs
2017/05/08 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
python和C语言混合编程实例
2014/06/04 Python
python实现多线程采集的2个代码例子
2014/07/07 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
Python hmac模块使用实例解析
2019/12/24 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
文案策划求职信
2014/03/18 职场文书
老公保证书范文
2014/04/29 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
开会通知短信大全
2015/04/20 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript