[OpenCv-python 기초 : 마우스 클릭으로 도형 만들기

2018. 5. 30. 00:09Python-이론/python-opencv

마우스 클릭으로 도형만들기



import cv2
import numpy as np
from random import shuffle
mode = True
img = np.zeros((512, 512, 3), np.uint8)
R = [i for i in range(256)]
G = [i for i in range(256)]
B = [i for i in range(256)]
drawing = False
ix = -1
iy = -1
def onMouseClick(event, x, y , flags, param):
#마우스 왼쪽 버튼이 눌렸을때 
    if event == cv2.EVENT_LBUTTONDOWN:
        global ix, iy, drawing, mode
        drawing = True
        ix, iy = x, y
        shuffle(R), shuffle(B), shuffle(G) #색을 랜덤으로 뽑음 
#마우스가 움직였을 때
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing:
            if mode:
                cv2.circle(param, (x, y), int(abs((x -ix) + (y-iy))/2), (B[0], G[0], R[0]), -1)
            else:
                cv2.rectangle(param, (ix, iy), (x,y), (B[0], G[0], R[0]), -1)
    else: #=> cv2.EVENT_LBUTTONUP이 있음
#마우스왼쪽 버튼이 때졌을 때 
        drawing = False
        if mode: #처음에서 x와 y의 마우스 커서 차이의 평균으로 반지름 정함
            cv2.circle(param, (x,y), int(abs((ix - x) + (iy - y)) / 2), (B[0], G[0], R[0]), -1)
        else:
            cv2.rectangle(param,  (ix, iy), (x,y), (B[0], G[0], R[0]), -1)

cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('window', onMouseClick, param=img)
while True:

    cv2.imshow('window', img)
    k = cv2.waitKey(1)
    if k == 27:
        break
#c를 누르면 원 <-> 직사각형으로 바꿈 
    elif k == ord('c'):
        mode = not mode