OpenCV/OpenCV 강좌

OpenCV 강좌 6 - 키보드 이벤트

KALILIVE 2020. 10. 7. 12:49
반응형

이전 강좌에서 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을 활용하여 제한할 수 있다.

반응형