이번 장에서는 openCV에서 나온 영상 또는 이미지에서 마우스를 이용하여 할 수 있는 작업에 대해서 알아보겠다

마우스를 이용하여 그림을 그리거나 특정 색상의 값을 얻을 수 있다 

 

1. 마우스 동작 

마우스의 동작의 종류는 3가지가 있다.  
마우스 오른쪽 버튼 동작, 왼쪽 버튼 동작, 가운데 버튼 동작 

이 3가지 동작마다 각각 눌렸을 때, 눌리고 올렸을 때, 더블클릭했을 때의 기능에 대해서 정의할 수 있다. 

  • EVENT_MOUSEMOVE : 마우스가 움직였을 때 
  • EVENT_LBUTTONDOWN : 마우스 왼쪽 버튼을 눌렀을 때 
  • EVENT_LBUTTONUP :  마우스 왼쪽 버튼을 올렸을 때 
  • EVENT_RBUTTONDOWN : 마우스 오른쪽 버튼을 눌렀을 때 
  • EVENT_RBUTTONUP : 마우스 오른쪽 버튼을 올렸을 때 
  • EVENT_MBUTTONDOWN : 마우스 가운데 버튼을 눌렀을 때 
  • EVENT_MBUTTONUP : 마우스 가운데 버튼을 올렸을 때 
  • EVENT_LBUTTONDBCLICK : 마우스 왼쪽 버튼을 두번 눌렀을 때
  • EVENT_RBUTTONDBCLICK : 마우스 오른쪽 버튼을 두번 눌렀을 때 
  • EVENT_MBUTTONDBCLICK : 마우스 가운데 버튼을 두분 눌렀을 때 

2. 마우스 콜백 함수의 파라미터 

def onMouse(event, x, y, flags, param):
    event = 위에서 정의한 마우스의 동작에 대한 감지 
    x, y = 해당 동작이 감지된 x, y 좌표값 ( 영상또는 이미지에 대한 )
    flags = 마우스 이벤트가 발생할 때의 특정 조건 (컨트롤, 쉬프트, 알트 등 키 조합 생성) 
    param = 파라미터로 전송될 값 (이미지 또는 특정 변수 전송)

 

import cv2 
import numpy as np 

class MouseGesture():
    def __init__(self) -> None:
        self.is_dragging = False 
        self.x0, self.y0, self.w0, self.h0 = -1,-1,-1,-1

    def on_mouse(self, event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            print("왼쪽 버튼 눌림 \t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_LBUTTONUP:
            print("왼쪽 버튼 올림\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_RBUTTONDOWN:
            print("오른쪽 버튼 눌림\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_RBUTTONUP:
            print("오른쪽 버튼 올림\t좌표 : x : {} y : {}".format(x,y) )    
        elif event == cv2.EVENT_MBUTTONDOWN:
            print("가운데 버튼 내림\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_MBUTTONUP:
            print("가운데 버튼 올림\t좌표 : x : {} y : {}".format(x,y) )
        # elif event == cv2.EVENT_MOUSEMOVE:
        #     # 마우스 움직임은 너무 많이 나와서 생략    
        #     print("마우스 움직임\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_MOUSEHWHEEL:
            # 가로휠이 없는 마우스라 .... 
            print("마우스 가로 휠 \t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_MOUSEWHEEL:
            print("마우스 그냥 휠 \t좌표 : x : {} y : {}".format(x,y) )
            
        return 

image = cv2.imread('test.JPG')
window_name = 'mouse_callback'
mouse_class = MouseGesture()

cv2.imshow(window_name, image)
cv2.setMouseCallback(window_name, mouse_class.on_mouse, param=image)
cv2.waitKey(0)

3. 적용 예시 

  • 마우스를 클릭한 위치의 픽셀의 값 확인 
    import cv2 
    import numpy as np 
    
    class MouseGesture():
        def __init__(self) -> None:
            self.is_dragging = False 
            # 마우스 위치 값 임시 저장을 위한 변수 
            self.x0, self.y0, self.w0, self.h0 = -1,-1,-1,-1
    
        def on_mouse(self, event, x, y, flags, param):
            if event == cv2.EVENT_LBUTTONDOWN:
                value = param[y,x,:]
                print("왼쪽 버튼 눌림 \t x : {} y : {} 좌표의 픽셀값은 : {}".format(x,y, value) )
            return 
    
    image = cv2.imread('test.JPG')
    window_name = 'mouse_callback'
    mouse_class = MouseGesture()
    
    cv2.imshow(window_name, image)
    cv2.setMouseCallback(window_name, mouse_class.on_mouse, param=image)
    cv2.waitKey(0)​
  • 마우스로 그림 그리기 
    import cv2 
    import numpy as np 
    
    class MouseGesture():
        def __init__(self) -> None:
            self.is_dragging = False 
            # 마우스 위치 값 임시 저장을 위한 변수 
            self.x0, self.y0, self.w0, self.h0 = -1,-1,-1,-1
    
        def on_mouse(self, event, x, y, flags, param):
            if event == cv2.EVENT_LBUTTONDOWN:
                self.x0 = x
                self.y0 = y
                self.is_dragging = True
                print("사각형의 시작 좌표는 x : {} y : {}".format(x,y) )
            elif event == cv2.EVENT_LBUTTONUP:
                self.is_dragging = False
                cv2.rectangle(param['image'], (self.x0, self.y0), (x,y),(0,0,255),2)            
                cv2.imshow(param['window_name'], param['image'])
                print("사각형의 좌표는 ({}, {}), ({}, {})".format(self.x0,self.y0,x,y) )
            elif event == cv2.EVENT_MOUSEMOVE:
                if self.is_dragging:
                    temp_img = param['image'].copy()
                    cv2.rectangle(temp_img, (self.x0, self.y0), (x,y),(0,0,255),2)            
                    cv2.imshow(param['window_name'], temp_img)
            return 
    
    
    image = cv2.imread('test.JPG')
    window_name = 'mouse_callback'
    mouse_class = MouseGesture()
    param = {
        "image" : image,
        "window_name" : window_name
    }
    cv2.imshow(window_name, image)
    cv2.setMouseCallback(window_name, mouse_class.on_mouse, param=param)
    cv2.waitKey(0)​
  •  

+ Recent posts