본문 바로가기
Development/OpenCV

[OpenCV] OpenCV circle, rectangle, text 그리기와 PIL 한글 text

by shuka 2021. 11. 17.
728x90
728x90

1. circle, rectangle, text

영상처리를 하다 보면 image에 여러 그림을 그리거나 point를 표시하거나 할 경우가 많다.

 

타원이나 line 등 많은 그리기 방법이 있지만 주로 rectangle을 그리거나 circle을 그리거나 text를 쓸 때가 많았다.

 

기본적으로 opencv를 이용한 각 그리기 함수의 parameter들은 밑에와 같다.

circle
cv2.circle(image, center, raddian, color, thickness)

rectangle
cv2.rectangle(image, start_point, end_point,color, thickness)

text
cv2.putText(image, text, location_point, font, font_scale, color)

 

ex) circle

img = cv2.circle(img, (120, 256), 5, (0, 0, 255), -1)
img = cv2.circle(img, (140, 256), 10, (0, 0, 255), -1)
img = cv2.circle(img, (170, 256), 15, (0, 0, 255), -1)
img = cv2.circle(img, (210, 256), 20, (0, 0, 255), -1)
img = cv2.circle(img, (270, 256), 30, (0, 0, 255), -1)

ex) rectangle

img = cv2.rectangle(img, (50, 50), (100, 100), (0, 0, 255), 5)
img = cv2.rectangle(img, (50, 50), (150, 150), (0, 255, 255), 5)
img = cv2.rectangle(img, (50, 50), (200, 200), (50, 50, 50), 5)
img = cv2.rectangle(img, (50, 50), (250, 250), (100, 100, 100), 5)
img = cv2.rectangle(img, (50, 50), (300, 300), (150, 150, 150), 5)

ex) text

cv2.putText(img, 'text', (50, 50), cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 255))
cv2.putText(img, 'test', (50, 80), cv2.FONT_HERSHEY_DUPLEX, 1, (0, 255, 0))
cv2.putText(img, '텍스트 테스트', (50, 120), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 0, 0))

 

 

2. opencv putText 한글 문제

opencv로 image에 text를 쓸 때 영어는 상관이 없는데 한글을 쓰려고 하면 위의 사진처럼 깨져서 나오게 된다.

 

한글 문제를 해결하기 위해 찾아보는데 opencv로는 한글 text를 쓰는게 안된다는 얘기들만 있었다.

 

만약, 한글을 굳이 써야 한다면 PIL을 사용하여 한글 text를 쓰면 된다.

 

 

font-nanum 설치

PIL에서 한글을 사용하기 위해서는 font-nanum을 설치해준다.

sudo apt-get install fonts-nanum*
sudo fc-cache -fv

설치가 완료되면 /usr/share/fonts/truetype에 nanum폴더가 생성된다.

 

 

convert opencv image to PIL image

만약 image를 PIL로 read했으면 상관 없지만 opencv로 read했을 경우 이미지를 변환해줘야 한다,

pil_image = cv2.cvtColor(open_cv_image, cv2.COLOR_BGR2RGB)
pil_image=Image.fromarray(pil_image)

 

PIL image에 대해 darw & save

위에서 설치한 폰트를 사용하기 위해 draw.text에 font 설정을 해주면 밑에와 같이 한글을 쓰는데 문제 없이 작동된다.

fontpath = "/usr/share/fonts/truetype/nanum/NanumMyeongjo.ttf"
font = ImageFont.truetype(fontpath, 20)
draw = ImageDraw.Draw(pil_image)

draw.text((50, 50), str('텍스트 테스트'),(0,0,255), font=font)

pil_image.save('b.jpg')

 

728x90
반응형

댓글