OpenCV

[OpenCV] 기초 5 : 키보드 이벤트/ 마우스 이벤트

AI 그게 뭔데 2022. 1. 30. 22:35

키보 이벤 처리하기

키보  대기 함수 - cv2.waitKey

cv2.waitKey(delay=None)
  • delay : 밀리초 단위 대기 시간. 
               delay ≤ 0 이면 무한히 기다림. 기본값은 0.

  (ASCII code). 키가 눌리 않으 -1을 반환한다.

 

 

참고 사항

  • cv2.waitKey() 함수는 OpenCV 창이 하나라도 있을 때 동작
  • 특정 키 입력을 확인하려면 ord() 함수를 이용
  • 주요 특수키 코드: 27(ESC), 13(ENTER), 9(TAB)
while True:
  if cv2.waitKey() == ord('q'):
  	break

 

 

✔ 키보 특수  처리하기

Windows 운영체제에서 방향,  함수키  특수키 입력은  cv2.waitKeyEx() 함수를 사용한다.

 

 

 

 

💬 실습

- 키보드에 'i'  'I'  누르 영상 반전시키기

 

import cv2
img = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)  
cv2.imshow('image', img)

while True:
    keycode = cv2.waitKey()
    if keycode == ord('i') or keycode == ord('I'):
        img = ~img
        cv2.imshow('image', img)  
    elif keycode == 27:
        break

cv2.destroyAllWindows()

 

 

 

 


마우스 이벤트 처리하기

마우 이벤 콜백함  함수 - cv2.setMouseCallback

cv2.setMouseCallback(windowName, onMouse, param=None)
  • windowName :  마우스 이벤트 처리를 수행할 창 이름
  • onMouse : 마우 이벤 처리 위한  함수 이름
                   마우스 이벤트 콜백 함수는 다음 형식을 따라야 한다.
  • param : 콜백 함수에 전달할 데이터

 

✔ 마우 이벤  ( 함수) 형식 - onMouse

onMouse(event, x, y, flags, param)
  • event : 마우스 이벤트 종류. cv2.EVENT_로 시작하는 상수
  • x : 마우스 이벤트가 발생한 x 좌표
  • y : 마우스 이벤트가 발생한 y 좌표
  • flags : 마우스 이벤트 발생 시 상태. cv2.EVENT_FLAG_로 시작하는 상수
  • param : cv2.setMouseCallback() 함수에서 설정한 데이터

 

✔ 마우 이벤  함수 event 인자

MouseEventTypes 열거형 상수 설명
cv2.EVENT_MOUSEMOVE 0 마우스가  위에서 움직이는 경우
cv2.EVENT_LBUTTONDOWN 1 마우스 왼쪽 버튼이 눌려지는 경우
cv2.EVENT_RBUTTONDOWN 2 마우스 오른쪽 버튼이 눌려지는 경우
cv2.EVENT_MBUTTONDOWN 3 마우스 가운데 버튼이 눌려지는 경우
cv2.EVENT_LBUTTONUP 4 마우스 왼쪽 버튼이 떼어지는 경우
cv2.EVENT_RBUTTONUP 5 마우스 오른쪽 버튼이 떼어지는 경우
cv2.EVENT_MBUTTONUP 6 마우 가운 버튼 떼어지 경우
cv2.EVENT_LBUTTONDBLCLK 7 마우  버튼 더블클릭하 경우
cv2.EVENT_RBUTTONDBLCLK 8 마우 오른 버튼 더블클릭하 경우
cv2.EVENT_MBUTTONDBLCLK 9 마우스 가운데 버튼을 더블클릭하는 경우
cv2.EVENT_MOUSEWHEEL 10 마우스 휠을 앞뒤로 돌리는 경우
cv2.EVENT_MOUSEHWHEEL 11 마우스 휠을 좌우로 움직이는 경우

 

 

✔ 마우 이벤  함수 flags 인자

MouseEventFlags열거형상수 설명
cv2.EVENT_FLAG_LBUTTON 1 마우  버튼 눌려 있음
cv2.EVENT_FLAG_RBUTTON 2 마우 오른 버튼 눌려 있음
cv2.EVENT_FLAG_MBUTTON 4 마우 가운 버튼 눌려 있음
cv2.EVENT_FLAG_CTRLKEY 8 CTRL 키가 눌려져 있음
cv2.EVENT_FLAG_SHIFTKEY 16 SHIFT 키가 눌려져 있음
cv2.EVENT_FLAG_ALTKEY 32 ALT 키가 눌려져 있음

 

 

💬 실습

마우스 이용 그림 그리기

import sys
import numpy as np
import cv2


oldx = oldy = -1

def on_mouse(event, x, y, flags, param):
    global oldx, oldy

    if event == cv2.EVENT_LBUTTONDOWN:
        oldx, oldy = x, y
        print('EVENT_LBUTTONDOWN: %d, %d' % (x, y))

    elif event == cv2.EVENT_LBUTTONUP:
        print('EVENT_LBUTTONUP: %d, %d' % (x, y))

    elif event == cv2.EVENT_MOUSEMOVE:
        if flags & cv2.EVENT_FLAG_LBUTTON:
            cv2.line(img, (oldx, oldy), (x, y), (0, 0, 255), 4, cv2.LINE_AA)
            cv2.imshow('image', img)
            oldx, oldy = x, y


img = np.ones((480, 640, 3), dtype=np.uint8) * 255

cv2.namedWindow('image')
cv2.setMouseCallback('image', on_mouse, img)

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

cv2.destroyAllWindows()