Python

[Python] [Mini PJT] OpenCV로 이미지에 텍스트 합성하기

breadz 2021. 7. 22. 20:12

 

 

이미지 편집 프로그램 개발 mini PJT를 진행하는 중에 아래 스토리보드에서처럼 직접 사용자의 입력을 받아 이미지를 편집할 수 있도록 Customizing 기능을 추가하여 version 업그레이드하기로 했다! 나는 OpenCV 라이브러리를 통해 사용자가 텍스트를 직접 입력하고, 적절한 폰트도 설정할 수 있도록 업그레이드 해보았다.🙌


🔔OpenCV의 텍스트 입력하는 함수 putText()

이미지에 사용자가 입력한 텍스트 출력하는 함수이다. 나는 아래와 같은 putText()함수의 파라미터 중 text 와 fontFace를 사용자 입력을 받았다.

cv2.putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]] )

parameter  
img 이미지 파일
text 텍스트 문구
org 텍스트 출력 시작 위치 좌표
fontFace cv2.FONT_HERSHEY_SIMPLEX : 0 - 중간 크기 산세리프 폰트
cv2.FONT_HERSHEY_PLAIN : 1 - 작은 크기 산세리프 폰트
cv2.FONT_HERSHEY_DUPLEX : 2 - 2줄 산세리프 폰트
cv2.FONT_HERSHEY_COMPLEX : 3 - 중간 크기 세리프 폰트
cv2.FONT_HERSHEY_TRIPLEX : 4 - 3줄 세리프 폰트
cv2.FONT_HERSHEY_COMPLEX_SMALL : 5 -COMPLEX 보다 작은 크기
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX : 6 - 필기체 스타일 폰트
cv2.FONT_HERSHEY_SCRIPT_COMPLEX : 7 - 복잡한 필기체 스타일
cv2.FONT_ITALIC : 16 - 이탈릭체 
fontScale 폰트 크기
color 폰트 색상
thickness 폰트 두께
lineType 선 종류 (default cv.Line_8)
- LINE_8 : 8-connected line
- LINE_4 : 4-connected line
- LINE_AA : antialiased line
bottomLeftOrigin org 사용 옵션이다. True : 좌측 하단, False : 좌측 상단

 


※ 폰트 종류

산세리프 : 산세리프(Sans-serif)는 획의 삐침이 없는 글씨체를 뜻하며, 한글 돋움체(고딕체)에 해당된다. 

산세리프는 영문으로 된 인쇄물에서 산세리프는 본문보다는 제목에 자주 쓰이는 서체이다. 그리고 글씨에 명료함과 모던함 혹은 미니멀리즘을 담고 싶을 때에도 쓰인다. 또 산세리프 계열의 폰트는 컴퓨터상의 텍스트에 적용되는 가장 보편적인 폰트인데, 특히나 저화질 디지털 화면일 경우에는 세리프 글꼴에 있는 세세한 부분이 사라지거나 너무 크게 나타날 수 있기 때문에, 아예 이러한 디테일을 없앤 산세리프가 쓰이게 된 것이다.  -출처 : 위키백과

세리프(serif)는 글자와 기호를 이루는 획의 일부 끝이 돌출된 형태를 가리킨다.

세리프가 있는 글꼴 세리프체(serif typeface, serifed typeface)라 하며, 세리프가 없는 글꼴은 산세리프(sans-serif, 여기서 sans는 프랑스어로 "없음"을 뜻한다.)로 부른다.

 


#️⃣ 전체 코드

import cv2

# 사용자 지정 원하는 텍스트 입력
text = input("입력하고 싶은 문구를 적어주세요! : ")

# 사용자 지정 원하는 폰트 지정
print("1번 : 보통 크기의 고딕체")
print("2번 : 작은 크기의 고딕체")
print("3번 : 보통 크기의 바탕체")
print("4번 : 작은 크기의 바탕체")
print("5번 : 필기체")

fontSelect = input("원하는 폰트를 선택해주세요! : ")
if fontSelect == '1':
    font = cv2.FONT_HERSHEY_SIMPLEX
elif fontSelect == '2':
    font = cv2.FONT_HERSHEY_PLAIN
elif fontSelect == '3':
    font = cv2.FONT_HERSHEY_COMPLEX
elif fontSelect == '4':
    font = cv2.FONT_HERSHEY_COMPLEX_SMALL
elif fontSelect == '5':
    font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX


# 이미지에 텍스트 입력!
cv2.putText( img, text, (10,70), font, 2, (255,255,255), 5)


# 이미지 보여주기
cv2.imshow('img', img)
# waitKey()는 키 입력을 기다리는 대기 함수.매개변수로 넘긴 시간안에 키를 입력하면 소스의 다음줄로 이동!
cv2.waitKey(0)
# destroyAllWindow()는 화면에 나타난 이미지 창을 종료
cv2.destroyAllWindows()

사용자 입력을 받는다
입력받은 텍스트 문구와 폰트가 출력됐다

 


😅 보완해야 할 점

1. OpenCV에서는 한글 지원이 어렵다. 따라서 영어 텍스트만 입력이 가능하고, 만일 한글 입력시 ???? 이렇게 물음표로 출력된다. 추후 numpy와 PIL 라이브러리를 통해 한글 입력이 가능하게 보완이 필요하다.

2. OpenCV 라이브러리 내에 사용 가능한 폰트가 한정돼 있다. PIL 라이브러리와 결합하여 로컬에 저장된 다양한 폰트를 지정할 수 있는 기능 보완이 필요하다.