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连接池实现示例程序
Nov 26 Python
python实现多线程采集的2个代码例子
Jul 07 Python
python实现ipsec开权限实例
Nov 11 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
Python3处理HTTP请求的实例
May 10 Python
python实现淘宝秒杀脚本
Jun 23 Python
深入浅析Python 中 is 语法带来的误解
May 07 Python
如何理解python面向对象编程
Jun 01 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
python 绘制正态曲线的示例
Sep 24 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 Python
pytorch fine-tune 预训练的模型操作
Jun 03 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设计模式之观察者模式的应用详解
2013/05/21 PHP
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
判断脚本加载是否完成的方法
2009/05/26 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
Ubuntu系统下Angularjs开发环境安装
2016/09/01 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
Python下的twisted框架入门指引
2015/04/15 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
对python模块中多个类的用法详解
2019/01/10 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
python全栈开发语法总结
2020/11/22 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
市场部专员岗位职责
2013/11/30 职场文书
公司年会晚会开幕词
2019/04/02 职场文书