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实现简单QQ单用户机器人的方法
Jul 03 Python
python中函数传参详解
Jul 03 Python
python 上下文管理器使用方法小结
Oct 10 Python
Python键盘输入转换为列表的实例
Jun 23 Python
python实现旋转和水平翻转的方法
Oct 25 Python
python进行文件对比的方法
Dec 24 Python
python实现合并两个排序的链表
Mar 03 Python
Python生成rsa密钥对操作示例
Apr 26 Python
Python实现微信小程序支付功能
Jul 25 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 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+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
javascript 写类方式之六
2009/07/05 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
JQuery下拉框应用示例介绍
2014/04/23 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
vue项目打包上传github并制作预览链接(pages)
2019/04/19 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
详解python播放音频的三种方法
2019/09/23 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
Python加速程序运行的方法
2020/07/29 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
会展中心部门工作职责
2013/11/27 职场文书
25岁生日感言
2014/01/13 职场文书
yy婚礼主持词
2014/03/14 职场文书
教师产假请假条范文
2014/04/10 职场文书
奥巴马连任演讲稿
2014/05/15 职场文书
日语专业求职信
2014/07/04 职场文书
大学生学年个人总结
2015/02/15 职场文书
开学随笔
2015/08/15 职场文书