이전글
5. 도형 그리기
빈 스케치북
이미지나 영상에서 도형은 특정 위치를 나타낼 때 사용할 수 있다. 예를 들어 얼굴인식에서 얼굴 부분에 사각형을 그린다거나, 눈, 코, 입을 표시할 때 동그라미로 나타내는 등 다양한 형태로 표시할 수 있다. 도형을 그리기에 앞서 도형을 보다 쉽게 확인하기 위해 빈 스케치북을 생성한다.
빈 스케치북을 만들때는 스케치북의 크기와 색상을 고려해 이를 반영하여 이미지를 출력하는 방법과 똑같이 출력만 하면 빈 스케치북을 출력할 수 있다. 스케치북 만드는 과정을 간단히 나타내면 다음과 같다.
크기 정하기 - array 만들기 - 스케치북 색상 정하기 - 스케치북 출력
1 ) 크기 정하기
이 전에 불러온 이미지에 대한 정보를 알기 위해 shape 함수를 사용했었다. shape함수를 사용하면 이미지의 height, width, channel 정보를 알 수 있었는데, 빈 스케치북을 만들때에는 이 정보를 사용자가 사용 목적과 상황에 따라 맞춰 정한다.
2 ) array 만들기
가로, 세로 크기를 정하고 나면 그 크기에 맞는 배열을 정의한다. 이때 이 배열을 만들때에는 numpy의 zeros 함수를 사용한다. zeros함수는 모든 값이 0인 배열을 생성하는데 이때 data type을 지정하는 dtype은 uint8로 한다.(uint8은 부호가 없는 8비트 정수를 의미힌다.)
import cv2
import numpy as np
img = zeros((height, width, channel), dtype = np.uint8)
위에서 정의한 img 배열을 출력해보면 다음과 같다.
print(img)
[[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
...
3 ) 스케치북 색상 정하기
스케치북의 색상, 즉 Channel 값을 지정하는 것은 사용자가 원하는 색상의 RGB를 모든 배열의 값에 적용하면 된다. 단 값의 순서는 R, G, B가 아니라 B, G, R 순서에 유의하여 값을 지정하며 모든 값이 0일때는 검정석, 모든 값이 255일 때는 흰색을 나타낸다.
# White
img[:] = (255,255,255)
# Blue
img[:] = (255, 0, 0)
4 ) 스케치북 출력
위에서 정의한 스케치북을 출력하는 방법은 이 전에 이미지를 출력하는 과정과 동일하다.
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
waitKey(0)은 무한대기의 의미로, 사용자가 아무키나 누르면 창이 종료된다.
위의 과정을 실행하면 다음과 같은 결과가 출력된다.
# ex. 세로 480 X 가로 640, Channel 3 (RGB)에 해당하는 흰색 배경의 스케치북 만들기
import cv2
import numpy as np
img = np.zeros((480, 640, 3), dtype = np.uint8)
img[:] = (255, 255, 255)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
일부 영역 색칠
위와 같이 스케치북을 한 색깔로 채울 수도 있지만 특정 부분만을 다른 색으로 채우는 것도 가능하다. RGB 코드를 입력할 때 일부 영역을 지정한 후, 다른 RGB 코드를 대입하면 부분적으로 다른 색을 칠할 수 있다.
img[세로영역, 가로영역] = 원하는 색 RGB 코드
# ex. 일부 영역을 파란색, 나머지 부분을 검정색으로 칠하는 경우
import cv2
import numpy as np
img = np.zeros((480, 640, 3), dtype = np.uint8)
img[100:200, 200:300] = (255, 0, 0)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
직선
직선에는 3가지 종류가 있다.
직선의 종류 (Line Type)
1. cv2.LINE_4 : 상하좌우 4방향으로 연결된 선
2. cv2.LINE_8 : 대각선을 포함한 8방향으로 연결된 선 (기본값)
3. cv2.LINE_AA : 부드러운 선 (Anti-Aliasing)
직선을 그릴때는 cv2.line 함수에 직선의 색상, 두께, 종류를 정해 그린다.
cv2.line(그릴 위치, (시작지점), (끝 지점), 색상, 두께, line type)
예를 들어 LINE_8 type의 직선을 그린다면 다음과 같이 작성할 수 있다.
import cv2
import numpy as np
img = np.zeros((480, 640, 3), dtype = np.uint8)
# 직선의 색상 : yellow
color = (0, 255, 255)
# 직선의 두께 : 3
thinckness = 3
# 직선의 종류 : LINE_8
cv2.line(img, (50, 100), (400,50), color, thinckness, cv2.LINE_8)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
LINE_4와 LINE_AA까지 함께 그리면 다음과 같다
import cv2
import numpy as np
img = np.zeros((480, 640, 3), dtype = np.uint8)
color = (0, 255, 255) # yellow
thinckness = 3
cv2.line(img, (50, 100), (400, 50), color, thinckness, cv2.LINE_8)
cv2.line(img, (50, 200), (400, 100), color, thinckness, cv2.LINE_4)
cv2.line(img, (50, 300), (400, 150), color, thinckness, cv2.LINE_AA)
cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
'Study > ML | DL' 카테고리의 다른 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 파일 저장 (0) | 2023.05.17 |
---|---|
[Python] OpenCV를 이용한 이미지/영상 처리 - 텍스트 (0) | 2023.05.12 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 도형그리기2(원형, 사각형, 다각형) (0) | 2023.05.04 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 동영상 및 카메라 출력 (0) | 2023.05.02 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 출력 (0) | 2023.05.01 |