這篇文章主要介紹了python基於opencv 實現影像時鐘的方法,幫助大家更好的理解和使用python,感興趣的朋友可以瞭解下
解決方案詳解
繪製錶盤
錶盤上只有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α
先只考慮將座標系原點移動到左上角,角度依然是平面座標系中的逆時針計算,那麼新座標是:
x=r+r×cosα
y=r+r×sinα
對於60條分/秒刻線,刻線間的夾角是360°/60=6°,對於小時刻線,角度是360°/12=30°,這樣就得到了72組起點座標,那怎麼得到終點座標呢?其實同樣的原理,用一個同心的小圓來計算得到B點:
通過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)
# 到這裡基本的錶盤圖就已經畫出來了
角度換算
接下來算是一個小難點,首先時鐘的起始座標在正常二維座標系的90°方向,其次時鐘跟影像一樣,都是順時針計算角度的,所以三者需要統一下:
因為角度是完全對稱的,順逆時針沒有影響,所以平面座標系完全不用理會,放在這裡只是便於大家理解。對於時鐘座標和影像座標,時鐘0的0°對應影像的270°,時鐘15的90°對應影像的360°,時鐘30的180°對應影像的450°(360°+90°)…
所以兩者之間的關係便是:
計算角度 = 時鐘角度+270°
計算角度 = 計算角度 if 計算角度<=360° else 計算角度-360°
同步時間
Python中如何獲取當前時間和新增日期文字都比較簡單,看程式碼就行,我就不解釋了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
相關文章
- python正規表示式
- python學習筆記
- 零基礎學習python
- LeetCode題解(0330):按要求補齊陣列(Python)
- LeetCode題解(0649):Dota2參議院(Python)
- LeetCode題解(0210):課程表II(Python)
- python反恐精英
- 【轉】Python之Numpy詳細教程
- 【轉】numpy:python資料領域的功臣
- MATLAB——基於影像相減的紙牌識別系統
- opencv學習筆記(二)-- 載入、修改和儲存影像
- windows下python3.8安裝_01
- LeetCode-Python-86. 分隔連結串列(連結串列)
- GitHub 上 25 個 Python 學習資源,你最多知道五個
- python基礎練習題(按條件對指定序列求和,列印99乘法表、求斐波那契數列、百馬百擔、求水仙花數、求n以內的所有質數(素數)和)、集合的講解、一些公關方法
- 3、Opencv播放視訊、儲存、暫停視訊,開啟攝像頭
- python安裝教程
- 使用Python來呼叫電腦音響
- Python模組安裝
- python 自動化測試 (一):安裝 requests,unittest,HTMLTestRunner