공부하는 아저씨의 IT 공방

파이썬 시각화 공부 3일(라인, 직사각형, 원 그리기, 오징어 게임 로고 만들기) 본문

파이썬 기초(1일 1코드)

파이썬 시각화 공부 3일(라인, 직사각형, 원 그리기, 오징어 게임 로고 만들기)

공대아저씨 2023. 9. 6. 22:02

안녕하세요 공대아저씨 입니다ㅎ

 

예전에 제가 석사할때 교수님께서 항상 하시던 말씀이 있습니다.


무슨말이냐면.. "선명한 기억보단 흐릿한 연필자국이 낫다." 라는 말입니다.

 

이 말은 저에게 아주 강한 인상을 주었어요. 그래서 지금도 갖고있는 습관 중 하나가 항상 어딘가에 기록하려는 습관을 

 

유지하려고합니다. 여러분들도 그 동안 공부하신 내용들을 어딘가에 잘 기록하시나요?

 

기록하는 습관은 굉장히 중요한것 같습니다. 제가 블로그를 하는 이유이기도 하구요 :)

 

그런 의미에서 오늘도 열심히 좋은 내용을 기록하고, 여러분께 공유하도록 노력해보겠습니다 :)

 

 

오늘은 파이썬 시각화 3일차! 라인부터 각 종 도형을 한번 코드를 짜서 그려보도록 하겠습니다.

 

1. 라인 그리기

 

import cv2
import numpy as np

img1 = np.ones((300, 300, 3), dtype = 'uint8')*255  # 1로 채워져있는 매트릭스에 255 곱해서 흰색으로 만듦

cv2.line(img1, (50, 50), (150, 250), (0,0,255), 5, cv2.LINE_AA) # BGR 순서
cv2.line(img1, (50, 75), (150, 275), (0,255,0), 2, cv2.LINE_4)
cv2.line(img1, (50, 100), (150, 300), (255,0,0), 1, cv2.LINE_8)

cv2.imshow('img1', img1)


cv2.waitKey()
cv2.destroyAllWindows()

 

3가지의 라인을 동시에 한번 그려보겠습니다.

라인그리기 할때 사용하는 코드는 cv2.line() 코드를 사용하는데, 안에는 

이미지 이름, 포인트 시작점, 포인트 종료점, 색상, 두께, 선의 그리기 방식 이런 순서로 작성됩니다.

 

 

라인그리기 결과물

 

2. 직사각형 그리기

 

import cv2
import numpy as np

img1 = np.ones((300, 300, 3), dtype = 'uint8')*255  # 1로 채워져있는 매트릭스에 255 곱해서 흰색으로 만듦

cv2.line(img1, (50, 50), (150, 250), (0,0,255), 5, cv2.LINE_AA) # BGR 순서
cv2.line(img1, (50, 75), (150, 275), (0,255,0), 2, cv2.LINE_4)

cv2.rectangle(img1, (50,50), (250,250), (255, 0, 255), 3, cv2.LINE_4) #선 두께를 음수로 하면 속을 채워좀
cv2.imshow('img1', img1)


cv2.waitKey()
cv2.destroyAllWindows()

 

직사각형을 만드는 코드는 cv2.rectangle() 입니다.

여기에 마찬가지로 이미지이름, 포인트 1, 포인트 2, 이미지 색상, 선의 그리기 방식 이런 순서로 표현됩니다.

 

선이랑 같이 그렸으니 결과물은 선이랑 같이나오겠죠?

 

 

사각형 그리기 결과물

 

3. 원 그리기, 텍스트 입력

 

다음은 원을 그리고 텍스트도 함께 입력해보겠습니다.

 

import cv2
import numpy as np

img1 = np.ones((300, 300, 3), dtype = 'uint8')*255  # 1로 채워져있는 매트릭스에 255 곱해서 흰색으로 만듦

cv2.line(img1, (50, 50), (250, 250), (0,0,255), 5, cv2.LINE_AA) # BGR 순서, 시작점 끝점
cv2.rectangle(img1, (50,50), (250,250) , (255, 0, 255), 3, cv2.LINE_4) #선 두께를 음수로 하면 속을 채워좀, 시작점 끝점
cv2.rectangle(img1, (70,70, 160, 160), (255, 255, 0), 3, cv2.LINE_4) #우상단 width, height
cv2.circle(img1, (50, 250), 40, (255, 126, 255)) # center, radius 순서

cv2.putText(img1, 'Practicing Drawing', (50,50), cv2.FONT_HERSHEY_PLAIN, 1, (0,0,0), 1, cv2.LINE_AA)


cv2.imshow('img1', img1)


cv2.waitKey()
cv2.destroyAllWindows()

 

코드를 보면 먼저 img 크기를 먼저 지정해주었고요,

 

선, 사각형은 앞서 실행한 코드와 동일하게 작성하였고,

 

원은 circle 코드를 이어서  작성하였습니다. (이미지, 중심점, 반지름, 색상..)

 

그리고 텍스트를 입력했는데, 텍스트는 cv2.putText() 코드를 활용하였습니다.

 

cv2.putText()의 문법은 다음과 같으니 참고하여 작성하세요!

Docstring:
putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) -> img
.   @brief Draws a text string.

 

원, 텍스트 입력 결과물

 

 

따라해보기. 오징어 게임 로고 만들기.

 

지금까지 해본 코드를 이용해서 오징어 게임 로고를 만들어 보겠습니다.

 

일단, 오징어 게임로고는 요렇게 생겼죠?

오징어 게임 로고

 

파이썬 코드를 짜기 전에 항상 중요한것은 머릿속에있는 도화지에 그림을 그리듯

 

내가 해야하는 코드의 순서를 한번 나열해보는 것입니다.

 

일단 저라면..

 

가로로 길다란 이미지를 먼저 그리고

 

원, 삼각형, 사각형을 좌표를 맞춰가면서 그림을 그릴 것 같아요.

 

코드는 다음과 같습니다!

 

import cv2
import numpy as np

img = np.full((200, 600, 3), (255, 255, 255), dtype = np.uint8 )


cv2.circle(img, (100, 100), 85, (0, 0, 0),thickness = 20) # center, radius 순서
cv2.rectangle(img, (215,15, 165, 165), (0, 0, 0), thickness = 20) 
# 좌상단, 우하단 혹은 우상단, 폭, 높이
cv2.line(img, (410, 190), (500, 10), (0,0,0), thickness = 20)
cv2.line(img, (500, 10), (590, 190), (0,0,0), thickness = 20)
cv2.line(img, (410, 190), (590, 190), (0,0,0), thickness = 20)

cv2.imshow('img', img)


cv2.waitKey()
cv2.destroyAllWindows()

 

결과물은 

 

요렇게 나왔네요 ㅎ

 

CV에서 도형을 그리거나 텍스트를 삽입하는 건 사용자가 이미지에 어떠한 표시를 한다거나 정보를 나타낼 때 사용하는

 

기본적인 스킬입니다.

 

나중에 하게될 실습 중 사람을 detection 한다거나 사람 얼굴을 detection하는 모형을 만들때도 결국,

 

사각형의 형태로 표현한다면 이 기법을 사용해서 코드를 작성하게 됩니다:)

 

무튼!! 현재는 굉장히 단순하고 쉬운 스킬이나 

 

나중에는 여러분들이 직접 만든 모델에 적용할 수 있는 툴들이니 한번씩 따라해보시기 바랍니다 :)

 

오늘도 긴 글 읽어주셔서 감사합니다.