OpenCV - 도형 그리기

3 분 소요

도형 그리기

선 (cv2.line)

#cv2.line(선을 그릴 이미지, 선의 시작점 좌표(x,y), 선의 끝점 좌표, 색상, 두께)
img = cv2.line(img, (0,0), (511,511), (0,0,0), 5)  # 검은색, 두께 5

사각형 (cv2.rectangle)

#cv2.rectangle(사각형 그릴 이미지, 시작점, 끝점, 색상, 두께)
img = cv2.rectangle(img, (100,100), (300, 300), (0,0,255), 10)  # 빨간색, 두께 10

원 (cv2.circle)

#cv2.circle(이미지, 중심점, 반지름, 색상, 두께)
img = cv2.circle(img, (400,400), 50, (0, 255, 0), 5)  # 초록색, 두께 5, 반지름 50px

타원 (cv2.ellipse)

'''
cv2.ellipse(이미지, 중심점, 중심점에서 가장 긴 거리와 짧은 거리, 기울기, 시작각도, 
						 끝각도, 색상, 두께)
'''

# 파란색, 테두리x 내부 채움, 중앙으로부터 가장 긴 거리 100px / 짧은 거리 30px, 기울기 -10도
# 0도부터 360도까지 한바퀴 모두 그린 타원  (삼성 로고 모양)
img = cv2.ellipse(img, (250, 250), (100, 30), -10, 0, 360, (255,0,0), -1)
  • 도형의 두께가 -1이면 테두리 대신 도형 안을 채운다

다각형 (cv2.polyline)

# cv2.polyline(이미지, 점들의 위치[리스트], 닫힘여부, 색상, 두께

pts = np.array([[100,400],[0,500],[200, 500]])  # 삼각형
img = cv2.polylines(img, [pts], True, (100,100,100), 8)
  • 닫힘여부가 False 일 경우 시작점과 마지막점을 잇지 않음
  • 다각형을 그리는 메서드이기는 하지만 실제로는 꺾는점이 존재하는 선(polyline)을 그리는 것이기 때문에 두께 -1 로 내부를 채우지는 못한다.

텍스트 출력 (cv2.putText)

# cv2.putText(이미지, 텍스트, 위치, 폰트, 글자크기, 색상, 두께)

text = 'Hello World!'
img = cv2.putText(img, text, (50,150), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 0), 3)

마우스로 그리기

마우스 이벤트

import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
events
>>> ['EVENT_FLAG_ALTKEY',
 'EVENT_FLAG_CTRLKEY',
 'EVENT_FLAG_LBUTTON',
 'EVENT_FLAG_MBUTTON',
 'EVENT_FLAG_RBUTTON',
 'EVENT_FLAG_SHIFTKEY',
 'EVENT_LBUTTONDBLCLK',
 'EVENT_LBUTTONDOWN',
 'EVENT_LBUTTONUP',
 'EVENT_MBUTTONDBLCLK',
 'EVENT_MBUTTONDOWN',
 'EVENT_MBUTTONUP',
 'EVENT_MOUSEHWHEEL',
 'EVENT_MOUSEMOVE',
 'EVENT_MOUSEWHEEL',
 'EVENT_RBUTTONDBLCLK',
 'EVENT_RBUTTONDOWN',
 'EVENT_RBUTTONUP']

마우스 왼쪽 버튼 누름 (EVENT_LBUTTONDOWN) / 뗌 (EVENT_MBUTTONUP), 오른쪽 버튼 더블클릭 (EVENT_RBUTTONDBLCLK) 등 마우스 동작에 대한 이벤트 상수들이 정해져있다.

마우스 그리기 예시

  • cv2.setMouseCallback(windowName, callback, param)
    • windowName - 마우스 이벤트를 감지할 윈도우 이름
    • callback - 등록할 핸들러 함수 이름
    • param - 핸들러 함수에 입력이 필요한 파라미터가 있을 경우 전달할 인자
import cv2
import numpy as np 

drawing = False #Mouse가 클릭된 상태 확인용
mode = True # True이면 사각형, false면 원
ix,iy = -1,-1

# Mouse Callback함수
def draw_circle(event, x,y, flags, param):
    global ix,iy, drawing, mode

    if event == cv2.EVENT_LBUTTONDOWN: #마우스를 누른 상태
        drawing = True 
        ix, iy = x,y
    elif event == cv2.EVENT_MOUSEMOVE: # 마우스 이동
        if drawing == True:            # 마우스를 누른 상태 일경우
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(255,0,0),-1)
            else:
                cv2.circle(img,(x,y),5,(0,255,0),-1)

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False;             # 마우스를 때면 상태 변경
        if mode == True:
            cv2.rectangle(img,(ix,iy),(x,y),(255,0,0),-1)
        else:
            cv2.circle(img,(x,y),5,(0,255,0),-1)

img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while True:
    cv2.imshow('image', img)

    k = cv2.waitKey(1) & 0xFF

    if k == ord('m'):    # 사각형, 원 Mode변경
        mode = not mode
    elif k == 27:        # esc를 누르면 종료
        break

cv2.destroyAllWindows()

트랙바 생성

  • cv2.createTrackbar(trackbarName, windowName, value, count, onChange) : 트랙바 객체 생성
    • trackbarName – 트랙바 이름
    • windowName – 트랙바를 붙일 윈도우 이름
    • value (int) – 트랙바 생성시 초기 값
    • count – 트랙바의 최대값. 최소값은 항상 0
    • onChange – 트랙바의 Slide값이 변경될 때 호출 되는 Callback함수. 전달되는 Paramter는 trackbar Position
  • cv2.getTrackbarPos(trackbarName, windowName)
    • trackbarName - 트랙바 이름
    • windowName - 트랙바가 등록된 윈도우 이름
import cv2
import numpy as np

def change_color(x):
    r = cv2.getTrackbarPos('R','image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')
		# 트랙바 위치 이동시 이동된 위치의 값을 위 변수에 전달

    if s == 0:  # 스위치 변수 s의 값이 0일 경우
        img[:] = 0   # 모든 행/열 좌표 값을 0으로 변경. 검은색
    else:
        img[:] = [b,g,r] # 모든 행/열 좌표값을 [b,g,r]로 변경
    cv2.imshow('image', img)

img = np.zeros((300,512,3), np.uint8)  # 검은색의 512x300px 트루컬러 이미지 생성
cv2.namedWindow('image')

# trackbar를 생성하여 named window에 등록
# 시작값 0부터 최대 255까지 변경 가능하며, 트랙바 위치 변경시 값을 change_color 함수에 전달
cv2.createTrackbar('R', 'image', 0, 255, change_color)
cv2.createTrackbar('G', 'image', 0, 255, change_color)
cv2.createTrackbar('B', 'image', 0, 255, change_color)

switch = '0:OFF\n1:On'  #트랙바 레이블
cv2.createTrackbar(switch, 'image', 1, 1, change_color)

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

cv2.destroyAllWindows()

댓글남기기