[Python] opencv - 도형 그리기

개발log·2024년 3월 4일
0

Python

목록 보기
9/17
post-thumbnail
# 빈 스케치북 만들기
import cv2
import numpy as np

# 세로 480 x 가로 640, 3 Channel(RGB) 스케치북
img = np.zeros((480,640,3), dtype=np.uint8) # np.uint8: 8비트, 0~255까지
print(img)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 결과
[[[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]]

 [[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]]

 [[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]]]

# 전체 공간을 흰 색으로 채우기
img[:] = (255,255,255) # BGR 순서

# 콘솔 결과
[[[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 ...

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]]

영역 색칠

## 일부 영역 색칠
import cv2
import numpy as np

img = np.zeros((480,640,3), dtype=np.uint8)
#[세로영역, 가로영역]
img[100:200, 200:300] = (255,255,255)
print(img)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

직선

  • cv2.LINE_4: 상하좌우 4방향으로 연결된 선
  • cv2.LINE_8: 대각선을 포함한 8방향으로 연결된 선(기본값)
  • cv2.LINE_AA: 부드러운 선(anti-aliasing)
import cv2
import numpy as np

img = np.zeros((480,640,3), dtype=np.uint8)

COLOR = (0,255,255) #BGR: YELLOW
THICKNESS = 3 # 두께

# 그릴 위치, 시작 점, 끝 점, 색, 두께, 선 종류
cv2.line(img, (50,100),(400,50), COLOR, THICKNESS, cv2.LINE_8)
cv2.line(img, (50,200),(400,150), COLOR, THICKNESS, cv2.LINE_4)
cv2.line(img, (50,300),(400,250), COLOR, THICKNESS, cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • cv2.circle(img, (300,200),RADIUS, COLOR, THICKNESS, cv2.LINE_AA):
    그릴 위치, 원의 중심점, 반지름, 색, 두께, 선 종류
  • 원을 채울 경우 THICKNESS 부분을 cv2.FILLED로 바꿈.
# 원
import cv2
import numpy as np

img = np.zeros((480,640,3), dtype=np.uint8)

COLOR = (255,255,0) #BGR: 하늘색
RADIUS = 50 # 반지름
THICKNESS = 10 # 두께

# 그릴 위치, 원의 중심점, 반지름, 색, 두께, 선 종류
cv2.circle(img, (300,200),RADIUS, COLOR, THICKNESS, cv2.LINE_AA)
# 채워진 원
cv2.circle(img, (500,200),RADIUS, COLOR, cv2.FILLED, cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

사각형

  • cv2.rectangle(img, (100,100),(200,200), COLOR, THICKNESS): 속이 빈 사각형
  • 원과 마찬가지로 속을 채우고 싶다면 THICKNESS 부분을 cv2.FILLED로 바꿈.
# 사각형
import cv2
import numpy as np

img = np.zeros((480,640,3), dtype=np.uint8)

COLOR = (0,255,0) #BGR: 초록색
THICKNESS = 3 # 두께

# 그릴 위치, 왼쪽 위 좌표, 오른쪽 아래 좌표, 색, 두께
cv2.rectangle(img, (100,100),(200,200), COLOR, THICKNESS) # 속이 빈 사각형
cv2.rectangle(img, (300,100),(400,200), COLOR, cv2.FILLED) # 속이 빈 사각형
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

다각형

  • cv2.polylines(img, [pts1], True, COLOR, THICKNESS, cv2.LINE_AA): 그릴 위치, 그릴 좌표들, 닫힘 여부, 색, 두께, 선 종류
  • cv2.fillPoly(img, pts3, COLOR, cv2.LINE_AA): 채우기
# 다각형
import cv2
import numpy as np

img = np.zeros((480,640,3), dtype=np.uint8)

COLOR = (0,0,255) #BGR: 빨간색
THICKNESS = 3 # 두께

# 세 개의 좌표를 잇는 도형 생성
pts1 = np.array([[100,100],[200,100],[100,200]])
# True는 닫힘 여부, pts1은 리스트 형태로 적어야 함
# 그릴 위치, 그릴 좌표들, 닫힘 여부, 색, 두께, 선 종류
cv2.polylines(img, [pts1], True, COLOR, THICKNESS, cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 닫힘 여부가 True일 때
  • 닫힘 여부가 False일 때

다각형 두 개 이어서

pts1 = np.array([[100,100],[200,100],[100,200]])
pts2 = np.array([[200,100],[300,100],[300,200]])

# cv2.polylines(img, [pts1], True, COLOR, THICKNESS, cv2.LINE_AA)
# cv2.polylines(img, [pts2], True, COLOR, THICKNESS, cv2.LINE_AA)
# 위와 아래의 결과는 같음
cv2.polylines(img, [pts1,pts2], True, COLOR, THICKNESS, cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 속 채운 다각형
    pts3=np.array([[[100,300],[200,300],[100,400]],[[200,300],[300,300],[300,400]]])
    # 그릴 위치, 그릴 좌표들, 색, 선 종류
    cv2.fillPoly(img, pts3, COLOR, cv2.LINE_AA)

profile
나의 개발 저장소

0개의 댓글