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中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
没编程基础可以学python吗
Jun 17 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 Python
python如何使用腾讯云发送短信
Sep 17 Python
pandas取dataframe特定行列的实现方法
May 24 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
Jun 11 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取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
全面理解闭包机制
2016/07/11 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python字符串的一些操作方法总结
2019/06/10 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
Ajax的优点和缺点
2014/11/21 面试题
制冷与电控专业应届生求职信
2013/11/11 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
入党申请书怎么写?
2019/06/21 职场文书
python运行脚本文件的三种方法实例
2022/06/25 Python