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

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

꼬예 2022. 9. 6.
[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법)

 

 

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

 

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

 

도화지 준비

 

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

 

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

 

1. 선그리기(cv2.line)

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 1. 선그리기(cv2.line)

 

output:

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 1. 선그리기(cv2.line)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 1. 선그리기(cv2.line)
[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 1. 선그리기(cv2.line)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 1. 선그리기(cv2.line)

 

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

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 1. 선그리기(cv2.line)

 

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

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

 

2. 사각형 그리기(rectangle)

 

사각형 그리기

 

output:

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

output:

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 2. 사각형 그리기(rectangle)

 

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

 

3. 원 그리기(circle)

 

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

 

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

 

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

 

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

 

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

 

output:

 

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

 

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

 

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

 

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

 

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

 

output:

 

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

 

4. 다각형 그리기(polylines)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 4. 다각형 그리기(polylines)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 4. 다각형 그리기(polylines)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 4. 다각형 그리기(polylines)

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 4. 다각형 그리기(polylines)

 

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

 

5. 글자 넣기(putText)

1) 문자열 텍스트

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 1) 문자열 텍스트

 

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

2) text 좌표지정

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 2) text 좌표지정

 

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

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 2) text 좌표지정

 

3) font지정

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 3) font지정

 

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

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 3) font지정

 

4) font 크기

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 4) font 크기

 

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

 

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

 

5) 한글 사용 하는 방법

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

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

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

output:

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

(1) pillow 설치

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

(2) 필요한 모듈 import

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

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

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

(4) 도화지 타입 변경

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

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

세번째컬러

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

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

 

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

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

 

output:

 

[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) - 5. 글자 넣기(putText) - undefined - 5) 한글 사용 하는 방법

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

댓글