AI 탐구노트

OpenCV에서 화면에 한글 표시하기 본문

기술 팁

OpenCV에서 화면에 한글 표시하기

42morrow 2025. 1. 8. 14:52

 

컴퓨터 비전 작업을 하다 보면 종종 화면에 결과를 표시해야 할 때가 있습니다. 객체 탐지 결과를 시각화하거나, 분석 데이터를 화면에 띄우는 경우가 많죠. 이 과정에서 "텍스트 출력"은 중요하지만, 생각보다 간단하지 않은 문제로 다가오곤 합니다. 특히 OpenCV를 사용할 때, 기본적으로 한글을 출력하려면 제약이 생기기 마련입니다. 한글이 깨지거나, 원하는 폰트를 적용하지 못하는 경우가 종종 발생하기 때문입니다. 이런 작은 문제 하나가 때로는 진행하고 있는 프로젝트의 완성도를 좌우할 수도 있습니다.

 

많은 개발자들이 이 문제를 해결하기 위해 다양한 접근법을 고민합니다. 한 가지 대표적인 방법은 OpenCV의 기본 텍스트 출력 함수(cv2.putText)가 아닌, 외부 라이브러리와의 조합을 활용하는 것입니다. 예를 들어, PIL(Python Imaging Library)을 OpenCV와 결합하면 훨씬 자유롭게 원하는 폰트를 설정하고 한글을 출력할 수 있습니다. 즉, PIL로 텍스트 이미지를 먼저 생성한 뒤, 이를 OpenCV의 이미지에 합성하는 방식이죠. 또는 Noto Sans 같은 오픈소스 한글 폰트를 사용하여 가독성과 디자인을 높이는 방법도 있습니다. 단순한 작업처럼 보이지만, 이 작은 기술적 해결책이 사용자 경험에 큰 차이를 만들어 냅니다.

 

이 글에서는 OpenCV를 이용해 화면 표시를 할 때 한글이 제대로 출력되도록 하는 작은 팁을 소개하겠습니다. 

 


OpenCV에서 기본 폰트를 이용해 텍스트 표시하는 방법

OpenCV에 포함된 기본 폰트를 이용할 경우, 아래 예시와 같이 한글이 깨져서 나오는데, 이는 OpenCV의 putText 함수가 utf-8을 지원하지 않기 때문이라고 합니다. 

 

import cv2
import numpy as np

img = np.full(shape=(256,512,3),fill_value=255,dtype=np.uint8)
text="Hello, 한글"
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,text,org,font,1,(255,0,0),2)

cv2.imshow("Result",img)
cv2.waitKey()
cv2.destroyAllWindows()

 

 

그림 : 기본 폰트를 이용할 경우, 한글이 깨짐

 

OpenCV에서 한글 텍스트를 표시하는 방법

 

1) Pillow와 OpenCV를 결합해 한글 텍스트를 출력하는 방법

 

우선 pillow 패키지를 설치합니다. 

$ pip install pillow

 

코드에서 다음과 같이 사용합니다. 

import cv2
import numpy as np
from PIL import ImageDraw, ImageFont, Image

img = np.full(shape=(256,512,3),fill_value=255,dtype=np.uint8)
text="Hello, 한글"

img_pil = Image.fromarray(img)

draw = ImageDraw.Draw(img_pil)
font = ImageFont.truetype('fonts/NanumGothic.ttf', size=20)
draw.text((50, 50), text, (255,0,0), font=font)

img = np.array(img_pil)

cv2.imshow("Result",img)
cv2.waitKey()
cv2.destroyAllWindows()

 

 

그림 : 한글이 깔끔하게 표시됩니다.

 

 

2) OpenCV의 FreeType 폰트 기능을 이용

OpenCV의 freetype 폰트 설정을 이용하는 방식입니다. 어찌보면 이 방식이 더 깔끔해 보이긴 한데 한 가지 문제가 있습니다. 기본 설치되는 OpenCV에는 FreeType 폰트를 지원하는 기능이 누락되어 있다는 것입니다. 이는 사용되는 세부 라이브러리에 대한 라이선스 조항 때문에 빠져 있답니다.

 

결국 이 방식을 사용하려면 OpenCV 를 소스에서 직접 빌드하는 수 밖에 없습니다. 흠... 배보다 배꼽이 더 커지는거 아닌가 싶죠? 하지만, AI 개발을 하는 분들은 대부분 최적의 성능을 내기 위해 소스에서 빌드하시는 분들이 많은데 그분들에겐 이 부분이 허들이 되지 않겠죠. 

 

 

import cv2
import numpy as np

font_path = "/usr/share/fonts/truetype/nanum/NanumGothic.ttf"
freetype = cv2.freetype.createFreeType2()
freetype.loadFontData(fontFileName=font_path, id=0)

image = np.zeros((500, 800, 3), dtype=np.uint8)
text="Hello, 한글"

freetype.putText(img=image,text=text,org=(50,50),fontHeight=20, color=(255,255,255),
                     thickness=-1,line_type=cv2.LINE_AA)

# 결과 이미지 표시
cv2.imshow("Result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 


정리하며

이번 글에서는 OpenCV라는 어쩌면 가장 많이 사용되는 영상 처리 패키지를 이용해서 사용자 어플리케이션을 만들 때 화면 상에 제대로 된 글자 표기, 특히 제대로 된 한글이 표시되도록 하는 것을 설명 드렸습니다. 

 

텍스트 출력과 같은 '세부 문제'는 인공지능 연구나 개발에서도 자주 접하게 되는 이슈입니다. 데이터 전처리 과정에서 발생하는 파일 인코딩 문제나 다국어 데이터 처리에서 발생하는 문자 처리 같은 사례도 비슷한 맥락이라고 할 수 있죠. 이러한 문제들은 프로젝트의 '보이지 않는 허들'이 되기 쉬운데요, 이를 간과해 넘어가지 않고 해결하면 더 완성도 높은 결과물을 만들어낼 수 있을 겁니다. 

 

텍스트 출력의 문제를 해결하는 과정은 기술적 디테일과 사용자 경험을 연결하는 중요한 접점입니다! 이는 인공지능 기술을 활용한 애플리케이션에서도 마찬가지일 텐데요, 모델의 정확도만큼이나 결과를 '어떻게 보여줄 것인가'에 대한 고민도 항상 머릿속을 떠나지 않도록 해야할 것 같습니다.