반응형
이번에는 키보드와 마우스 입력을 처리하는 방법에 대해 알아봅니다
키보드와 마우스를 입력할 때 창을 제어할 수 있는 방법을
이해할 수 있는 시간을 가져보도록 하겠습니다.
키보드 이벤트 처리하기
이전에 많이 사용한 waitKey() 함수를 사용하면 키보드의 입력을 알아낼 수 있었습니다
키보드의 입력에 따라서
창이 이동하는 코드를 작성해 보겠습니다.
기본적으로 cv2.waitKey() 함수가 입력받는 키 값은 ASCII 코드의 키 값이므로
한글은 되도록 사용하지 않습니다.
import cv2
file_path = 'a.jpg'
img = cv2.imread(file_path)
title = 'KeyBoard Control'
x, y = 200, 200
while True:
cv2.imshow(title, img)
cv2.moveWindow(title, x, y)
key = cv2.waitKey(0) & 0xFF # 키보드 입력 대기, 8비트 마스크 처리
print(key, chr(key)) # 키보드 입력 값, 문자 값 출력
if key == ord('a'):
x -= 10 # a가 입력되면 왼쪽으로 이동
elif key == ord('s'):
y += 10 # s가 입력되면 아래로 이동
elif key == ord('w'):
y -= 10 # d가 입력되면 위로 이동
elif key == ord('d'):
x += 10 # w가 입력되면 오른쪽으로 이동
elif key == ord('q') or key == 27:
break # q이거나 esc이면 종료.
cv2.destroyAllwindows()
cv2.moveWindow(title, x, y) # 새로운 좌표로 창 이동
w, a, s, d를 차례대로 입력해 보면
FPS게임의 방향처럼
윈도우 창이 이동하는 걸 볼 수 있습니다
마우스 이벤트 처리하기
import cv2
title = 'mouse event control'
img = cv2.imread('a.jpg')
cv2.imshow(title, img)
def onMouse(event, x, y, flags, param):
print(event, x, y, )
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(img, (x,y), 30, (255,0,0), -1)
cv2.imshow(title, img)
cv2.setMouseCallback(title, onMouse) # 마우스 콜백 함수를 GUI 윈도우에 등록
while True:
if cv2.waitKey(0) & 0xFF == 27:
break
cv2.destroyAllWindows()
실행해보면 그림이 열리고 마우스를 누르게 되면 파란색 점이 나오게 되는 코드입니다
onMouse라는 함수를 선언할 때는 모두 5개의 인자를 선언해야 합니다.
함수 내부에서 사용하지 않더라도 5개의 인자는 선언부에 기재해야 하며 그렇지 않으면 오류가 발생합니다.
event는 발생한 이벤트의 종류를 나태 내는 것이고
flags는 이벤트가 발생할 때 키보드나 마우스의 추가적인 상태를 알려줍니다
이 값과 비교할 상수는 이름이 cv2.EVENT_FLAG로 시작하는 상수들입니다.
flag로부터 상태를 각각 알아내는 방법은 다음과 같습니다
if flags & cv2.EVENT_FLAGS_LBOTTON: # 왼쪽 버튼 누름
if flags & cv2.EVENT_FLAGS_RBOTTON: # 오른쪽 버튼 누름
if flags & cv2.EVENT_FLAGS_MBOTTON: # 가운데 버튼 누름
if flags & cv2.EVENT_FLAGS_LCTRLKEY: # 컨트롤 버튼 누름
if flags & cv2.EVENT_FLAGS_SHIFTKEY: # 쉬프트 버튼 누름
if flags & cv2.EVENT_FLAGS_ALTKEY: # 알트 버튼 누름
if flags & cv2.EVENT_FLAGS_LCTRLKEY and cv2.EVENT_FLAGS_SHIFTKEY:
# 컨트롤과 쉬프트 같이 누름
또한 cv2.EVENT_LBUTTONDOWN 과 같은 마우스 이벤트 종류는 여러 가지가 있으며
아래와 같습니다
cv2.EVENT_MOUSEMOVE # 마우스 움직임
cv2.EVENT_LBUTTONDOWN # 왼쪽 버튼 누름
cv2.EVENT_RBUTTONDOWN # 오른쪽 버튼 누름
cv2.EVENT_MBOTTONDOWN # 가운데 버튼 누름
cv2.EVENT_LBOTTONUP # 왼쪽 버튼 뗌
cv2.EVENT_RBOTTONUP # 오른쪽 버튼 뗌
cv2.EVENT_MBOTTONUP # 가운데 버튼 뗌
cv2.EVENT_LBOTTONBLUCK # 왼쪽 버튼 더블 클릭
cv2.EVENT_RBOTTONBLUCK # 오른쪽 버튼 더블 클릭
cv2.EVENT_MBOTTONBLUCK # 가운데 버튼 더블 클릭
cv2.EVENT_MOUSEWHEEL # 휠 스크롤
cv2.EVENT_MOUSEHWHEEL # 가로 휠 스크롤
키보드+마우스 동시 입력 이벤트 처리하기
import cv2
title = 'mouse event'
img = cv2.imread('a.jpg')
cv2.imshow(title, img)
colors = {'white' : (255,255,255),
'red' : (0,0,255),
'blue' : (255,0,0),
'green' : (0,255,0) }
def onMouse(event, x, y, flags, param):
print(event, x, y, flags)
color = colors['white']
if event == cv2.EVENT_LBUTTONDOWN:
# 컨트롤 & 쉬프트 키를 같이 누른상태로 마우스 왼쪽버튼을 누른경우
if flags & cv2.EVENT_FLAG_CTRLKEY and flags & cv2.EVENT_FLAG_SHIFTKEY:
color = colors['green']
# 쉬프트 키를 누르고 마우스를 누른상태로 마우스 왼쪽버튼을 누른경우
elif flags & cv2.EVENT_FLAG_SHIFTKEY:
color = colors['blue']
# 컨트롤 키를 누르고 마우스를 누른상태로 마우스 왼쪽버튼을 누른경우
elif flags & cv2.EVENT_FLAG_CTRLKEY:
color = colors['red']
# 지름 20크기의 흰색원을 해당 좌표에 그림
cv2.circle(img, (x,y), 20, color, -1)
cv2.imshow(title, img)
cv2.setMouseCallback(title, onMouse)
while True:
if cv2.waitKey(0) & 0xFF == 27:
break
cv2.destroyAllWindows()
flag와 event를 이용해서 키보드 상태와 마우스 클릭을 이용한 코드입니다
반응형
'Python > OpenCV' 카테고리의 다른 글
[파이썬]OpenCV 두가지 이미지를 쉽게 합성해 보기 (0) | 2023.05.24 |
---|---|
[파이썬]OpenCV 카메라로 사람 얼굴 인식하기, 모자이크 씌우기 (0) | 2023.05.24 |
[파이썬]OpenCV로 카메라를 모니터에 출력 및 사진찍고 녹화 하는법 (0) | 2023.05.23 |
[파이썬]VS CODE에서 잘 되던 opencv 라이브러리가 오류 날때 해결법(import cv2 오류 해결법) (0) | 2023.05.23 |
[파이썬]OpenCV 로 이미지 읽기 및 저장하기 (0) | 2023.05.22 |