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 가 이미지 시 계 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기