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 |
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), (0, 0, 255), 5) # 이렇게 line 함수를 쓰면 마우스를 빠르게 움직여도 문제없음
cv2.imshow('image', img)
oldx, oldy = x, y
img = np.ones((480, 640, 3), 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
'난 이 분야 전문가야! > OpenCV' 카테고리의 다른 글
컴퓨터비전인강 3주차:: 영상에서의 히스토그램 (0) | 2021.03.07 |
---|---|
컴퓨터비전인강 3주차 :: 영상에서의 산술과 다양한 색 공간 (0) | 2021.03.06 |
컴퓨터비전인강 2주차 :: openCV 웹캠, 비디오 재생 및 저장 (0) | 2021.02.24 |
컴퓨터비전인강 1주차 :: matplotlib 이미지 openCV로 불러오기, 픽셀 참조 (0) | 2021.02.21 |
컴퓨터비전인강 1주차 :: 영상의 이해 및 openCV 주요함수 (1) | 2021.02.19 |