pbj0812의 코딩 일기

[PYTHON] OpenCV 를 활용한 타임스탬프 어플 클론 코딩 본문

ComputerLanguage_Program/PYTHON

[PYTHON] OpenCV 를 활용한 타임스탬프 어플 클론 코딩

pbj0812 2020. 10. 17. 02:51

0. 목표

 - 아래와 같은 타임스탬프 어플 클론 코딩

1. 실습

 1) 사진 준비

 2) library 호출

import cv2
import numpy as np
from PIL import Image
import math
import time
import datetime

 3) 이미지 불러오기

imgfile = './kalimba_ori.jpeg'
image = cv2.imread(imgfile)

 4) 정사각형으로 만들기

  - 어플의 형태는 정사각형 그림이므로 위 사진을 정사각형으로 변형

  - x 보다 y가 크면 최소 길이를 y로 잡고 반대면 x로 잡음

  - 사진의 중앙에서 최소 길이의 절반만큼 빼고 더한 구간을 새로운 이미지로 설정

x, y, z = np.shape(image)

if x > y:
    min_len = y
else:
    min_len = x
    
image2 = image[int(x/2) - int((min_len)/2):int(x/2) + int((min_len)/2), int(y/2) - int((min_len)/2):int(y/2) + int((min_len)/2), :]

  - 테스트

image_test = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)
display(Image.fromarray(image_test))

 5) 테두리 생성

  - 색상은 하얀색

  - 라인의 굵기는 4)에서 구한 최소 길이를 50으로 나눈 몫(올림)

  - 사각형의 시작과 끝은 시작점에서 5%인 구간에서 95%인 구간

x2, y2, z2 = np.shape(image2)
color = (255, 255, 255)
thickness = math.ceil(min_len / 50)
cv2.rectangle(image2, (int(0.05 * x2), int(0.05 * y2)), (int(x2 - 0.05 * x2), int(y2 - 0.05 * y2)), color, thickness)

  - 테스트

image_test = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB) # Converting BGR to RGB
display(Image.fromarray(image_test))

 6) 현재 시각 입력

  (1) 현재 시각 확보

now = time.localtime()

  (2) AM, PM 연산

   - 현재 시각이 13보다 작으면 AM, 이상이면 PM

   - format을 이용해서 두자리수로 표현

if now.tm_hour < 13:
    AM_OR_PM = ' AM'
    t_hour = "%02d" %(now.tm_hour)
else:
    AM_OR_PM = ' PM'
    t_hour = "%02d"%(now.tm_hour - 12)

  (3) 분

   - 두자리수 표현

t_min = "%02d"%(now.tm_min)

  (4) 월, 일, 년

   - datetime 을 통한 영어 월 이름 획득

s = "%04d-%02d-%02d"%(now.tm_year, now.tm_mon, now.tm_mday)
dt = datetime.datetime.strptime(s, '%Y-%m-%d')

first_line = t_hour + ':' + t_min + AM_OR_PM
second_line = dt.strftime('%B %d, %Y')

  - 테스트

print(first_line)
print(second_line)

   - 결과

02:40 AM
October 17, 2020

  (5) 이미지에 각인

   - x 좌표는 전체 길이에서 10% 구간, y 좌표는 80%, 85% 구간

   - 폰트 크기와 굵기는 first_line 에 하얀 줄 굵기의 1/4, second_line 에 1/8 만큼 부여

cv2.putText(image2, first_line, (int(0.10 * x2), int(0.8 * y2)), cv2.FONT_HERSHEY_PLAIN, int(thickness/4), color, int(thickness/4), 1)
cv2.putText(image2, second_line, (int(0.10 * x2), int(0.85 * y2)), cv2.FONT_HERSHEY_PLAIN, int(thickness/8), color, int(thickness/8), 1)

 7) 저장

cv2.imwrite("./result.jpeg", image2)

2. 결과

3. 참고

 - Python OpenCV | cv2.putText() method

 - OpenCV 1. 도형 그리기 문자 (Python)

 - What's the best way to convert a date in the form yyyy-mm-dd to a date using English month names?

 - Python - datetime/time module, 현재 시간 출력 방법

 - [Python]파이썬 자리수 조절(소수점,올림,반올림)

Comments