본문 바로가기
Python/Computer Vision

[파이썬, Python] OpenCV - 키보드, 마우스 이벤트

by coding-choonsik 2023. 8. 24.
728x90
반응형
SMALL

1. 키보드 이벤트

  •  cv2.waitKey(delay)
    • delay: 밀리초(ms) 단위 대기(0보다 작거나 같으면 무한정 기다림, 기본값 0)
    • return: 눌려진 아스키 코드값(ESC: 27, ENTER: 13, TAB: 9 ..)
import cv2

img = cv2.imread('dog.bmp')
cv2.imshow('img',img)

# 화면 띄우고 키가 들어오기 전까지 띄워짐
# 매개변수가 주어지지 않을 때 무한정 기다림
# cv2.waitKey()

while True:
    keyvalue = cv2.waitKey()
    # ord(): 아스키코드값을 리턴
    if keyvalue == ord('i') or keyvalue == ord('I'):
        img = ~img  # 색상값을 반전
        cv2.imshow('img', img)
    elif keyvalue == 27:
        break

▲ 키보드'i'키를 눌렀을 때 색상값 반전 


2. 마우스 이벤트

  • cv2.setMouseCallback(윈도우이름, 콜백함수, 파라미터)
  •  윈도우이름: 마우스 이벤트를 처리할 윈도우의 이름(창의 이름)
  •  콜백함수: 마우스 이벤트가 발생할 때 호출될 콜백함수를 설정
  •  파라미터: 콜백함수에 전달할 추가적인 정보
# 콜백함수
def 함수명(event, x, y, flags, param):
	pass
  • event: 어떤 이벤트가 실행되는지에 대한 객체
  • x, y: 마우스의 x, y 좌표
  • flags: 마우스 버튼이 눌리고 있는지 떼어졌는지 여부
  • param: 추가적인 정보가 전달되었다면 저장

 

✅ 빈 흰색 창에서 마우스 이벤트로 그림 그리기

import cv2
import numpy as np

# 전역변수
oldx = oldy = 0

def on_mouse(event, x, y, flags, param):
    global oldx, oldy  # 전역변수를 지역변수로 사용하기 위해
    if event == cv2.EVENT_LBUTTONDOWN:  # 왼쪽 마우스 버튼이 눌렸다면
        oldx, oldy = x, y   # 이벤트가 실행된 좌표가 oldx, oldy에 저장
        print('왼쪽 버튼이 눌렸어용: %d, %d' %(x, y))
    elif event == cv2.EVENT_LBUTTONUP:  # 왼쪽 마우스 버튼이 떼어졌다면
        print('왼쪽 버튼이 떼었어용: %d, %d' %(x,y))  # 마우스를 뗀 부분의 좌표가 찍힘
    elif event == cv2.EVENT_MOUSEMOVE:  # 마우스가 움직인다면
        if flags & cv2.EVENT_FLAG_LBUTTON:  # flag:이벤트가 실행되고있는지(True), 계속 왼쪽 버튼이 눌리고있는지
            cv2.line(img, (oldx, oldy), (x,y), (255, 51, 255), 3)
            cv2.imshow('img', img)
            oldx, oldy = x, y  # 갱신

# 컬러 이미지(255로 채워진 흰색 이미지)
img = np.ones((500, 500, 3), dtype=np.uint8)* 255
cv2.namedWindow('img')  # 창에 대한 이름을 줄 때
cv2.setMouseCallback('img', on_mouse, img)  # 파라미터로 img 객체를 넘김


cv2.imshow('img', img)
cv2.waitKey()

 

 

728x90
반응형
LIST