무효 클릭 IP 추적 중...
머신러닝,딥러닝/opencv

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법)

꼬예 2022. 9. 6.

 

 

이번 포스팅에서는 opencv 함수를 이용하여 그림 그리기 및 글자 쓰는 방법에 대해 알아보도록 하겠습니다.

 

먼저 그림 그리기에 앞서 그림을 그릴 도화지를 준비 해야겠죠?

 

도화지 준비

 

아래와같이 500x 500x 3 shape의 하얀색 배경을 만들었습니다.

 

흰색 배경을 사용하는데 굳이 컬러 채널인 3채널을 이용한 이유는 추후 그림을 그릴때 사용되는 컬러를  입력받기 위해서 입니다.

 

1. 선그리기(cv2.line)

 

 

output:

 

 

선은 cv2.line함수를 이용합니다.

 

 

2번째, 3번째 인자에 들어간 튜플 값은 두 점의 좌표를 의미합니다.

 

 

4번째 인자에 들어간 값은 컬러를 의미하는데요. B G R 순서로 설정되어있습니다.

우리 예시에서는 R 에 255가 채워졌으니까 도화지상에 빨간색 선이 그려진걸 알 수 있습니다.

 

 

마지막 인자에 들어간값은 선 굵기를 의미하고 5px로 하겠다는 의미 입니다.

만약 해당 인자를 지정해주지 않으면 디폴트로 1px가 적용됩니다.

 

2. 사각형 그리기(rectangle)

 

사각형 그리기

 

output:

 

 

두번째 인자에 들어간 튜플 (50, 200, 150, 100) 에서 50, 200은 사각형 좌상단의  x축, y축 좌표를 의미하고,

 

 

150, 100은 사각형의 width, height를 의미합니다.

 

 

이 방법 외에도 아래와 같이 좌표를 두개로 쪼개서 적어줄 수도 있는데요.

 

 

(50, 200)은 이전과 마찬가지로 사각형의 좌상단 좌표,

(200, 300)은 width, height가 아닌 우하단 좌표를 가리킵니다.

 

 

4번째 인자에 들어간 튜플은 컬러를 의미하는데요

 

 

B G R순서에서 G가 255이니까 초록색 그림이 그려집니다.

 

 

마지막에 위치한 5는 선두께 5px을 의미합니다.

 

참고로 두께가 -1로 주게되면 

 

output:

 

 

해당 도형을 채우는 형태로 출력이 됩니다.

 

3. 원 그리기(circle)

 

 

두번째 인자로 들어가있는  튜플 (200, 200)원의 중심 좌표를 의미합니다.

 

 

세번째 인자로 들어가있는 30은, 원의 반지름 길이를 의미합니다.

 

나머지부분은 컬러와 , 두께를 의미합니다.

 

output:

 

 

약간 원이 자글자글한 느낌이 있는데  우리가 직접 입력하지는 않았지만 디폴트로 설정(cv2.LINE_8)되어있는 값이 있기 때문인데요.

 

 

해당 부분을 cv2.LINE_AA로 수정해주면 보다 스무스한 원을 구현할 수 있습니다.

 

 

output:

 

 

4. 다각형 그리기(polylines)

 

이번에는 아래와 같은 다각형을 그려보겠습니다.

 

 

먼저 그리고 싶은 다각형의 꼭지점 좌표들을 numpy ndarray 형태로 만들어줍니다.

 

 

그리고 앞서 좌표가 적힌 array를 리스트형태로 두번째 인자에 넣어줍니다.

 

 

3번째 인자로 들어간 boolean값은 마지막 좌표와 첫번째 좌표를 이어줄지 말지를 결정하는 것인데요. 만약 False로 지정한다면, 아래와 같은 형태로 그려지겠죠.

 

 

나머지 부분은 마친가지로 컬러두께를 의미합니다.

 

5. 글자 넣기(putText)

1) 문자열 텍스트

 

 

두번째 인자에 우리가 출력하고 싶은 문자열 텍스트를 넣어줍니다.

2) text 좌표지정

 

 

세번째 튜플은 글자의 좌측 하단 좌표를 가리킵니다.

 

그림으로 표시하면 아래와 같습니다.

 

 

3) font지정

 

 

4번째 인자글자의 폰트를 지정해주는 부분인데요.

opencv에서 기본 제공하는 폰트는 아래와 같습니다.(한글에는 적용이 안됨)

 

 

4) font 크기

 

 

5번째 인자에 들어가는 값은 font크기를 조절하는 부분인데요. 1을 기준으로 크면 글자가 커지고 1보다 작아지면 작아진다라고 이해하시면 됩니다.

 

나머지는 앞서 설명했듯이 컬러글자 두께를 의미하고, cv2.LINE_AA는 원그리기에게서 설명했듯이, 글자를 더 매끄럽게 표현해주기 위해 사용 되었다고 보시면 됩니다.

 

5) 한글 사용 하는 방법

지금까지 배운 방식으로 한글 text를 출력하려고 하면 아래와같이 ??????가 출력됩니다.

opencv에서는 한글을 지원해주지 않기 때문입니다.

 

output:

 

 

이 문제를 pillow를 통해 해결해보도록 하겠습니다.

 

(1) pillow 설치

 

 

(2) 필요한 모듈 import

 

 

(3) 사용하고 싶은 font 가져오기

 

 

저는 fonts라는 디렉토리를 생성하고 그 안에 마루부리 폰트를 설치하여 넣어 놨는데요.

(해당 폰트는 링크에서 다운 받을 수 있습니다.)

 

아래와 같은 방법으로 우리가 사용할 폰트의 경로를 첫번째 인자에 넣어줌으로써 해당 폰트를 사용할 수있게 됩니다.

 

 

두번째 인자에 들어가있는 20은 해당 폰트의 크기를 의미합니다.

 

 

(4) 도화지 타입 변경

이제 지정한 폰트를 도화지에 그려줘야 할 차례입니다.

그런데 기존 도화지는 넘파이 array로, pillow로 제작한 폰트를 사용할 수 없습니다.

 

 

그렇기에 아래와 같은 방식으로 numpy array의 타입을 변경해줘야 합니다.

 

 

실제로 타입이 변경된걸 확인 할 수 있습니다.

 

 

다음으로 img_pil 객체를 ImageDraw.Draw()인자 안에 넣어주는 형태draw란 새로운 객체를 생성합니다.

 

 

생성한 draw객체를 이용해서 글자를 적을 수 있습니다. 

 

 

먼저 첫번째 인자에 있는 튜플값은 텍스트의 좌하단좌표 값을 의미합니다.

 

두번째 인자사용할 텍스트를 넣는자리,

 

 

세번째컬러

 

 

마지막 부분은 우리가 지정한 font를 넣는 자리입니다.

 

마지막으로 cv2.imshow()로 이미지를 띄워주기 위해 pillow image객체로 변경한 것을 다시 ndarray형태로 변경해줍니다.

 

 

output:

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글