본문 바로가기

난 이 분야 전문가야!/OpenCV

컴퓨터비전인강 2주차 :: 키보드, 마우스 이벤트 처리 및 트랙바 생성법

Ch 02. OpenCV-Python 기초 사용법 - 07. 키보드 이벤트 처리하기

Ch 02. OpenCV-Python 기초 사용법 - 08. 마우스 이벤트 처리하기

Ch 02. OpenCV-Python 기초 사용법 - 09. 트랙바 사용하기

 

 

오늘은 openCV를 사용하여 윈도우창에서 발생하는 키보드, 마우스 이벤트를 처리하는 방법과

추가적으로 트랙바를 생성하는법에 대해서 공부해 보았습니다.

 

 

>> 키보드 이벤트 처리하기

 

cv2.waitKey(delay=None) -> retval

 

delay: 밀리초 단위 대기 시간. delay <= 0 이면 무한히 기다림.
retval:
눌린 키 값(ASCII code). 키가 눌리지 않으면 -1

 

1
2
3
while True:
    if cv2.waitKey() == ord('q'):
    break
cs
파이썬의 ord() 함수를 이용하여 자주 사용됨
 

insert, delete, home, end, 방향키, f1~f12 특수 키를 사용하고 싶은 경우에는

cv2.waitKeyEx() 함수를 사용해야 한다.

 

> 키보드 이벤트 처리 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
img = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
 
cv2.namedWindow('image')
cv2.imshow('image', img)
 
while True:       
    key = cv2.waitKey()
    if key == 27:
        break
    elif key == ord('i'):
        img = ~img
        cv2.imshow('image', img)
        
cv2.destroyAllWindows()
cs

(주의) 여기서 while문은 아래와 같이 작성하면 안된다.

1
2
3
4
5
6
while True:     
    if cv2.waitKey() == 27:
        break
    elif cv2.waitKey() == ord('i'):
        img = ~img
        cv2.imshow('image', img)
cs

cv2.waitKey() 함수가 두번 호출되면서 'i'를 두번 눌러야지만 영상을 반전시킨다.

 

 

>> 마우스 이벤트 처리하기

 

cv2.setMouseCallback(windowName, onMouse, param=None) -> None

 

windowName: 마우스 이벤트 처리를 수행할 창 이름

onMouse: 마우스 이벤트 처리를 위한 콜백 함수 이름.

           onMouse(event, x, y, flags, param) -> None

param: 콜백 함수에 전달할 데이터

 

onMouse(event, x, y, flags, param) -> None

 

함수명은 각 기능에 맞게 변경해 주면 된다.

event: 마우스 이벤트 종류.  cv2.EVENT_로 시작하는 상수

       cv2.EVENT_MOUSEMOVE           ->  마우스가 창 위에서 움직이는 경우
       cv2.EVENT_LBUTTONDOWN       ->  마우스 왼쪽 버튼이 눌려지는 경우
       cv2.EVENT_RBUTTONDOWN       ->  마우스 오른쪽 버튼이 눌려지는 경우 등등

x, y: 마우스 이벤트 발생 좌표

flags: 마우스 이벤트 발생 시 상태. cv2.EVENT_FLAG_로 시작하는 상수

       cv2.EVENT_FLAG_LBUTTON       ->  마우스 왼쪽 버튼이 눌려져 있음
       cv2.EVENT_FLAG_RBUTTON       ->  마우스 오른쪽 버튼이 눌려져 있음 등등

param: cv2.setMouseCallback() 함수에서 설정한 데이터.

 

> 마우스 이벤트 그림 그리기 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
oldx = oldy = -1
 
def draw(event, x, y, flags, param):
    global oldx, oldy, img
    
    if event == cv2.EVENT_LBUTTONDOWN:
        oldx, oldy = x, y
        print('EVENT_LBUTTONDOWN: ', x, y)
    elif event == cv2.EVENT_LBUTTONUP:
        print('EVENT_LBUTTONUP: ', x, y)
    elif event == cv2.EVENT_MOUSEMOVE:
        if flags & cv2.EVENT_FLAG_LBUTTON:
            # 이렇게 그림을 그리면 중간에 놓치는 현상 발생 그래서 직선을 긋는식으로 코드 작성
#             cv2.circle(img, (x, y), 5, (0, 0, 255), -1)   
            cv2.line(img, (oldx, oldy), (x, y), (00255), 5)  # 이렇게 line 함수를 쓰면 마우스를 빠르게 움직여도 문제없음
            cv2.imshow('image', img)
            oldx, oldy = x, y
 
img = np.ones((4806403), dtype=np.uint8) * 255
 
cv2.namedWindow('image')  # 윈도우 창을 먼저 생성해 주어야 함
 
cv2.setMouseCallback('image', draw)
cv2.imshow('image', img)
cv2.waitKey()
 
cv2.destroyAllWindows()
cs

 

cv2.setMouseCallback() 함수 사용시 주의사항

콜백함수는 반드시 cv2.namedWindow() 함수 호출 이후 윈도우 창이 떠있는 상태에서 실행시켜줘야 한다.

만약 namedWindow() 함수를 사용하지 않고 바로 imshow() 함수를 사용하여 영상을 호출할 경우 imshow() 함수 호출 이후에 사용해 주어야 한다.

 

 

>> 트랙바 사용하기

 

cv2.createTrackbar(trackbarName, windowName, value, count, onChange)

 

value: 트랙바 위치 초기값
count:
트랙바 최댓값, 최솟값은 항상 0
onChange:
트랙바가 변경될 때마다 호출되는 함수

 

 

 

 

 

강의 링크: bit.ly/2NTHHz7

728x90