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
반응형
'OpenCV' 카테고리의 다른 글
| OpenCV 트랙바(cv2.createTrackbar) (0) | 2024.03.16 |
|---|---|
| OpenCV 연산 시간 측정(cv2.TickMeter) (0) | 2024.03.16 |
| OpenCV 카메라와 동영상 처리(cv2.VideoCapture, cv2.VideoWriter) (0) | 2024.03.15 |
| OpenCV 그리기 함수(직선, 사각형, 원, 다각형, 문자열) (2) | 2024.03.15 |
| OpenCV 마스크 연산& ROI (0) | 2024.03.15 |