키보드 이벤트 처리하기
✔ 키보드 입력 대기 함수 - 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()
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 영상처리 : 영상의 밝기 조절 (0) | 2022.01.31 |
---|---|
[OpenCV] 기초 6 : 트랙바 (0) | 2022.01.31 |
[OpenCV] 기초 4 : 카메라와 동영상 처리 (0) | 2022.01.30 |
[OpenCV] 기초 3 : 마스크 / 그리기 함수 (0) | 2022.01.30 |
[OpenCV] 기초 2 (0) | 2022.01.30 |