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α
먼저 좌표계 원점 을 왼쪽 상단 으로 이동 시 키 는 것 만 고려 하고 각 도 는 평면 좌표계 의 시계 반대 방향 으로 계산 하면 새 좌 표 는:
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)
#
각도 환산
그 다음 에 작은 난점 이 라 고 할 수 있다.먼저 시계의 시작 좌 표 는 정상 적 인 2 차원 좌표계 의 90°방향 에 있 고 그 다음 에 시 계 는 이미지 와 마찬가지 로 모두 시계 방향 으로 각 도 를 계산 하기 때문에 세 가 지 는 통일 되 어야 한다.
각 도 는 완전히 대칭 적 이 고 시계 반대 방향 으로 영향 을 주지 않 기 때문에 평면 좌표 계 는 전혀 신경 쓰 지 않 고 여기에 두 면 이해 하기 쉽다.시계 좌표 와 이미지 좌표 에 대해 시계 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 가 이미지 시 계 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.