728x90

마우스를 패인트 브러쉬로 사용하기

 

 

 

 

 

 

 

 

 

 

1. 목표

- 마우스 이벤트를 핸들링(다루는) 방법을 배워봅시다.

- 여기서 다음 함수를 사용하겠습니다 : cv2.setMouseCallback()

 

 

2. 간단한 데모

 

 이미지에 더블클릭하면 원을 그리는 간단한 어플을 만들어 보겠습니다.

 

- 마우스 콜백 함수를 만듭시다

 

-. 마우스 이벤트가 발생할때마다(왼쪽 마우스 누르거나, 때는 등) 해당 마우스 이벤트의 좌표를 알려줍니다.

 

- 이때 이벤트와 좌표로 아무거나 할수 있습니다. 

 

- 마우스 콜백 함수(이벤트가 발생시 호출할 함수)를 특정한 형식으로 정의해주고, 더블 클릭을 할때 원을 그리는 동작을 하도록 해봅시다.

 

 

 

 

import cv2
import numpy as np

# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),100,(255,0,0),-1)

# Create a black image, a window and bind the function to window
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

파일명 : 01_simplecallback.py

 

=> 더블 클릭한 자리에 반지름이 100픽셀인 꽉찬 파란색이 생성되었습니다.

 

 

 

 

 

3. 사진에 콜백을 등록해서 원그리기

 

import cv2
import numpy as np

# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),20,(255,0,0),4)

# Create a black image, a window and bind the function to window
img = cv2.imread("/Users/jdo/Documents/GitHub/opencv_python/04day/sarangsonnim.png",cv2.IMREAD_COLOR)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

파일 명 : 02_demo.py

- 아래의 가족 사진에  반지름 20, 폭이 2인 파란색 원을 그리는 콜백함수 등록 하는 응용프로그램

 

 

 

 

 

 

 

4. 데모 프로그램 개선하기

 

 이번에 더 나은 어플을 만들어 봅시다. 이번에는 설정한 모드에 따라서 사각형을 그리거나 원을 드래그를 해서 그릴수 있도록 구현하겠습니다. 그래서 마우스 콜백 함수에는 2파트로 나뉘게 되는데, 하나는 사각형, 나머지 하나는 원을 그리는 내용들이 되겠습니다

 

 다음 예시가 나중에 물체 추적과 영상 분할같은 상호작용(인터렉티브) 어플을 만들고 이해하는데 많은 도움이 되겠스비다.

 

 

import cv2
import numpy as np
import math

drawing = True # true if mouse is pressed
mode = False # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1

# mouse callback function
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_LBUTTONUP:
		drawing = False
		if mode == True:
			cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),5)
		else:
			radius = (ix-x)^2 + (iy - y)^2
			print(radius)
			cv2.circle(img,(x,y),int(radius),(0,0,255),5)


img = cv2.imread("/Users/jdo/Documents/GitHub/opencv_python/04day/sarangsonnim.png",cv2.IMREAD_COLOR)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break

cv2.destroyAllWindows()

파일명 ; 03_dragdemo.py

 

1. 사진을 띄웁니다.

2. 마우스 콜백 등록합니다.

3. 마우스 콜백에서 마우스 왼쪽을 누르면 시작점 지정

4. 꾹 누른 상태에서 이동후 마우스 올리면 현재 위치까지 사각형이나 해당 길이를 반지름으로 하는 원이 그려짐

5. 중간에 m키를 누르면 모드가 변경

 

 

300x250

+ Recent posts