이전 강좌에서 cv2.waitkey() 함수를 통하여 키보드에서 입력된 값을 수신할 수 있다고 배웠었다.
이번 강좌에서는 키보드 이벤트에 관하여 좀 더 자세히 설명하고 그에 따른 예제를 통해
확실히 배워보자.
키보드 이벤트
함수 | 설명 |
cv2.waitKey(delay) | 키보드로부터 입력된 1byte의 키값을 받는다. |
cv2.waitKeyEx(delay) | 키보드로부터 입력된 2byte의 키값을 받는다. |
1바이트? 차이로 무슨일이 가능해질까?
cv2.waitKey()를 이용하여 대부분의 키값을 얻을 수 있지만 1byte의 용량 제한으로 인해 받지 못하는 키값도 발생한다.
키(F1, F2, …, F12), ↑, ↓, ←, → 화살표 키 등 특수 키들이 대표적이다.
특수키 | cv2.waitKeyEx() 반환값 | 특수키 | cv2.waitKeyEx() 반환값 |
Insert | 0x2d0000 | F2 | 0x710000 |
Delete | 0x2e0000 | F3 | 0x720000 |
Home | 0x240000 | F4 | 0x730000 |
End | 0x230000 | F5 | 0x740000 |
Page Up | 0x210000 | F6 | 0x750000 |
Page Down | 0x220000 | F7 | 0x760000 |
← | 0x250000 | F8 | 0x770000 |
↑ | 0x260000 | F9 | 0x780000 |
→ | 0x270000 | F10 | 0x790000 |
↓ | 0x280000 | F11 | 0x7a0000 |
F1 | 0x700000 | F12 | 0x7b0000 |
만약 위 키외에 더많은 키를 입력받고 싶으면 ASCII 표를 참고하면 된다.
[Python/OpenCV 관련 잡다한 지식] - OpenCV 키보드 이벤트 관련 ASCII표
OpenCV 키보드 이벤트 관련 ASCII표
문자에서 원하는 처리 키보드이벤트를 찾은뒤에 cv2.waitKey()== 로 처리하면 됩니다. 예제) ESC 키 cv2.waitKey() == 0x1B 10진수 16진수 문자 10진수 16진수 문자 10진수 16진수 문자 10진수 16진수 문자 0 0x00..
kali-live.tistory.com
예제
이제 cv2.waitKeyEx()함수를 활용하여 실전문제를 해결해보자.
import numpy as np
import cv2
width,height=512,512
x,y,R=256,256,50
direction = 0 #right
while True:
key=cv2.waitKeyEx() # 키보드에서 입력키받음
if key == 0x1B: #ESC키
break
elif key==0x270000: # 방향키 방향 전환 0x270000==right
direction=0
elif key==0x280000: # 방향키 방향 전환 0x280000==down
direction=1
elif key==0x250000: # 방향키 방향 전환 0x250000==left
direction=2
elif key==0x260000: # 방향키 방향 전환 0x260000==up
direction=3
if direction ==0:
x+=5
elif direction==1:
y+=5
elif direction==2:
x-=5
elif direction==3:
y-=5
if x<R:
x=R
direction=0
if x>width-R:
x=width-R
direction=2
if y<R:
y=R
direction=1
if y>height-R:
y=height-R
direction=3
img = np.zeros((width,height,3),np.uint8)+255
cv2.circle(img,(x,y),R,(0,0,255),-1)
cv2.imshow('img',img)
cv2.destroyAllWindows()
cv2.waitKeyEx()를 통해 만약 방향키가 입력되면 x, y 변수를 조작하여 도형을 움직일 수 있게 만들었다.
단 여기서 반복문 끝에 img를 키값이 입력받을때 마다 초기화해줘야 이전 img데이터에 그려진 도형과 겹치지
않고 도형을 움직일수 있다.
키보드의 화살표 키를 눌러 도형을 상하좌우로 조작할 수 있다.
if x<R:
x=R
direction=0
if x>width-R:
x=width-R
direction=2
if y<R:
y=R
direction=1
if y>height-R:
y=height-R
direction=3
이 코드에서 확인 할수 있듯이 도형이 경계를 벗어나면 자동으로 위치를 설정하여 경계를 넘지 못하도록 제한하는
코드이다.
여기서 원의 반지름이 R이기 때문에 R을 활용하여 제한할 수 있다.
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
OpenCV 강좌 7 - 마우스 이벤트 🖱️ (0) | 2020.11.08 |
---|---|
OpenCV 강좌 5 - 문자를 출력하자~ (0) | 2020.10.04 |
OpenCV 강좌 4 - 도형을 그리자. (0) | 2020.10.03 |
OpenCV2 강좌 3 - 비디오 프레임 캡처 및 표시 (0) | 2020.09.11 |
OpenCV 강좌 2 - 영상 입출력과 Display (0) | 2020.09.10 |