프로그래밍 언어 및 IT 정보/opencv_python

[opencv_python] 3. 이벤트 처리 (키보드, 마우스, 트랙바)

Himer_torr 2022. 7. 13. 11:42
반응형

저번 포스팅에 이어 opencv로 도형을 그리는 예제를 공부해보도록 하겠습니다.

저는 Visual studio code와opencv 4.5.5 버전을 이용하였습니다.

 

opencv의 영상 출력을 진행하고 출력되는 창에서 발생하는 키보드 입력, 마우스 입력 이벤트 등을 사용자에게

전달하는 인터페이스를 제공하며, 이를 이용해 사용자 입력을 실시간으로 처리할 수 있는 프로그램을 만들 수 있습니다.

 

키보드 이벤트


앞의 블로그에서 사용본적 있는 cv2.waitKey() 함수는 키보드의 입력을 알아낼 수 있습니다.

cv2.waitKey(delay)

Parameters

  • delay: 밀리초 단위의 지연입니다. 0은 "영원히"를 의미하는 특별한 값입니다.

이 함수는 delay인자에 밀리초 단위로 숫자를 전달하면 해당 시간 동안 프로그램을 멈추고 대기하다가

키보드에 눌린 키에 대응하는 코드 정수값을 반환합니다.

0은 시간을 무한대로 하겠다는 의미이므로 누를 때까지 프로그램은 멈추고 이때는 -1을 반환할 일은 없습니다.

출력되는 키 값은 ASCII 코드와 같다는 것을 알 수 있습니다.

아스키 코드 예시

 

파이썬에서는 기본함수인 ord() 함수를 사용하면 편리하게 키를 확인할 수 있습니다.

>>> ord('a')
97

>>> ord('z')
122

하지만 몇몇 64비트 환경에서 cv2.waitKey() 함수는 8비트(ASCII 코드 크기) 보다 큰 32비트 정수를 반환해서

그 값을 다른 값으로 판단할 때가 있습니다.

그래서 하위 8비트를 제외한 비트를 지워야하는 경우가 있는데, 그럴 경우는 0xFF& 연산을 통해 제어할 수 있습니다.

그래서 가끔 여러 예제에 키보드 값 비교를 할 때 0xFF가 들어있는 것입니다.

key = cv2.waitKey(0) & 0xFF
if key == ord('a'):

 

마우스 이벤트


키보드와 마찬가지로 마우스에서도 이벤트를 받아올 수 있는데, 마우스 이벤트의 종류에 대해서

사전 정의가 되어있습니다.

cv2.setMouseCallback(windowName, callback, param=None)

Parameters

  • windowName: mouse evnet를 등록할 윈도우 이름
  • callback: callback함수 , callback 함수에는 event, x, y, flags, param 이 전달된다.
  • param: callback 함수에 전달되는 Data

 

역시 백문이 불여일견이라고 마우스 이벤트와 키보드 입력을 가지고 예제를 진행해보겠습니다.

import cv2


title = 'event'	#   window_title 이름

img = cv2.imread('./blank_500.jpg')
cv2.imshow(title,img)


def onMouse(event,x,y,flags,param):          # 마우스 callback함수 구현 ...1
    print(event,x,y)
    if event ==cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img,(x,y),30,(0,0,0),-1) 
        cv2.imshow(title,img)

cv2.setMouseCallback(title,onMouse)	# 마우스 콜백함수를 GUI 윈도우에 등록 ...2


while True:
    if cv2.waitKey(0) & 0xFF == ord('a'): # 키보드 입력 구현 ...3
        break

cv2.destroyAllWindows()

이번 예제는 흰바탕의 이미지에 마우스가 클릭할 시 검정 원을 그리고 보여줍니다. (1)

함수 구현 후 setMouseCallback 함수로 원하는 위도우에 등록을 해줍니다 (2)

탈출을 원할 시  키보드 입력 a를 눌러 while문을 빠져나가게 합니다.(3)

예제코드 동작 화면

 

 

트랙바


트랙바(track-bar)는 슬라이드 모양의 인터페이스를 마우스로 움직여 값을 입력받는 GUI 요소입니다.

트랙바의 생김새

트랙바는 cv2.createTrack() 함수로 생성하게 되는데, cv2.getTrackbarPos() 함수도 같이 사용되어

트랙바의 값을 얻어옵니다.

마우스 이벤트 방식과 마찬가지로 트랙바를 움직였을때 동작할 함수를 미리 준비해서 전달합니다.

cv2.createTrackbar(trackbarName, windowName, value, count, onChange)

Parameters

  • trackbarName: 트랙바 이름
  • windowName: 윈도우 이름
  • value(int): 트랙바 생성될 때 초기값
  • count: Trackbar의 Max값, Min은 항상 0으로 생성됨
  • onChange: Slide값이 변경 때 호출되는 Callback함수
cv2.getTrackbarPos(trackbarName, windowName)

Parameters

  • trackbarName: 트랙바 이름
  • windowName: 트랙바가 등록된 윈도우 이름

 

import cv2

title = 'Trackbar'
img = cv2.imread('blank_500.jpg')
cv2.imshow(title, img)

def onChange(x):
    # R, G, B 각 트랙바 위치값
    r = cv2.getTrackbarPos('R',title)
    g = cv2.getTrackbarPos('G',title)
    b = cv2.getTrackbarPos('B',title)
    img[:] = [b,g,r]	# 기존 픽셀값에 새로운 값  적용
    cv2.imshow(title,img)

cv2.createTrackbar('R', title,255, 255, onChange)  # 트랙바 제작
cv2.createTrackbar('G', title,255, 255, onChange)
cv2.createTrackbar('B', title,255, 255, onChange)

while True:
    if cv2.waitKey(1) & 0xFF == ord('a'):
        break
cv2.destroyAllWindows()

예제 실행 결과

 

반응형