Computer Vision/opencv(python)

[10] 키보드, 마우스, 트랙바 이벤트 처리하기

jwjwvison 2021. 3. 16. 00:05
  • 키보드 입력 대기 함수
cv2.waitKey(delay=None) -> retval

 

 

  • 키보드에서 'i' 또는 'I' 키를 누르면 영상을 반전
import sys
import numpy as np
import cv2

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()

 

  • 마우스 이벤트 콜백함수 등록 함수
cv2.setMouseCallback(windowName,onMouse,param=None) -> None

 

  • 마우스 이벤트 처리 함수(콜백 함수) 형식
onMouse(event,x,y,flags,param) -> None

 • event: 마우스 이벤트 종류 . cv2. 로 시작하는 상수
 • x: 마우스 이벤트가 발생한 x 좌표
 • y: 마우스 이벤트가 발생한 y 좌표
 • flags: 마우스 이벤트 발생 시 상태 . cv2.EVENT_ 로 시작하는 상수
 • param: cv2.setMouseCallback() 함수에서 설정한 데이터

 

  • 마우스 이벤트 처리 함수의 event 인자

 

  • 마우스 이벤트 처리 함수의 flags 인자

 

  • 마우스를 이용한 그리기 예제
import cv2
import sys
import numpy as np

oldx=oldy= -1

def on_mouse(event,x,y,flags,param):
    global img,oldx,oldy
    
    if event==cv2.EVENT_LBUTTONDOWN:
        oldx,oldy=x,y
        print('EVENT_LBUTTONDOWN: {},{}'.format(x,y))

    elif event==cv2.EVENT_LBUTTONUP:
        print('EVENT_LBUTTONUP: {},{}'.format(x,y))
    elif event==cv2.EVENT_MOUSEMOVE:
        if flags & cv2.EVENT_FLAG_LBUTTON:                 #flag 를 체크할때는 &를 쓰는것이 좋다
            # print('EVENT_MOUSEMOVE: {},{}'.format(x,y))
            #cv2.circle(img,(x,y),5,(0,0,255),-1)
            cv2.line(img,(oldx,oldy),(x,y),(0,0,255),5)
            cv2.imshow('image',img)
            oldx,oldy=x,y

img=np.ones((480,640,3),dtype=np.uint8)*255

cv2.namedWindow('image')
cv2.imshow('image',img)

cv2.setMouseCallback('image',on_mouse) 
cv2.waitKey()

 

  • 트랙바 사용하기
  • 트랙바 생성 함수
cv2.createTrackbar(trackbarName, windowName, value, count, onChange) -> None

 • trackbarName : 트랙바 이름
 • windowName : 트랙바를 생성할 창 이름 .
 • value: 트랙바 위치 초기값
 • count: 트랙바 최댓값 . 최솟값은 항상 0.
 • onChange 트랙바 위치가 변경될 때마다 호출할 콜백 함수 이름

 

  • 트랙바를 이용한 그레이스케일 레벨 표현
import cv2
import numpy as np

def on_level_changed(pos):
    global img

    level=pos*16
    # level=np.clip(level,0,255)    무조건 0~255사이 값을 갖게됨

    if level>=255:
        level=255

    img[:,:]=level               #255보다 큰 값을 주면 0으로 바뀜
    cv2.imshow('image',img)


img=np.zeros((480,640),np.uint8)

cv2.namedWindow('image')
cv2.imshow('image',img)

cv2.createTrackbar('level','image',0,16, on_level_changed)  #무조건 창을 생성하고 나서 만들어야 한다

cv2.waitKey()

cv2.destroyAllWindows()