본문 바로가기
OpenCV

OpenCV 키보드, 마우스 이벤트 처리

by Kwonys 2024. 3. 16.
728x90
반응형

1. 키보드 이벤트 처리

간단히 'I' or 'i' 키를 눌렀을 때 고양이 사진을 반전하며 ESC 키를 눌렀을 때 이미지를 종료하는 코드를 작성해보았습니다.

import sys
import cv2
import os
os.chdir('C:\coding\OpenCV\ch02') # can't open/read file: check file path/integrity 오류 해결을 위해 경로 설정


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

if img is None:
    print('Image load failed!')
    sys.exit()

cv2.namedWindow('image')
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.waitKey()를 변수로 지정해주지 않고 아래와 같이 진행하면 waitKey()가 두번 동작해  'i' or 'I' 키를 두번 눌러야 동작함

아래와 같은 실수를 하지 말 것

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

    elif cv2.waitKey() == 27:
        break

1. 마우스 이벤트 처리

 

1.1 마우스 이벤트 콜백함수 등록 함수

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

 

1.2 마우스 이벤트 처리 함수(콜백 함수) 형식

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

 

1.3 마우스 이벤트 처리 함수의 event 인자

 

1.4 마우스 이벤트 처리 함수의 flags 인자

 

 

흰 480x640 창에 그림판 처럼 그림을 그리고 마우스(왼쪽 키)를 눌렀을 때와 뗐을 때의 좌표를 출력하는 코드를 작성해보겠습니다.

import sys
import numpy as np
import cv2
import os
os.chdir('C:\coding\OpenCV\ch02') # can't open/read file: check file path/integrity 오류 해결을 위해 경로 설정

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:  # flag를 체크할 때는 and 연산자 사용하는 것이 좋다.
            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()

* 주의할 점:

cv2.setMouseCallback 함수는 window를 만들어 준 다음에 실행 해야 한다.

ex) 아래와 같이 실행 할 수 없음

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

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

 

  • 실행결과 :

728x90
반응형