이번 장에서는 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)
'Machine Learning > Computer Vision' 카테고리의 다른 글
(에러를 딛고 깨달은) opencv perspective transform 후 선 그린 후 원본에서 해당 선의 위치 구하기 - 역변환 하기, 점 변환 (0) | 2022.03.10 |
---|---|
(10) OpenCV python - 색상 범위 추출 - inRange (0) | 2021.11.27 |
(8) OpenCV python - 차영상 기법, background subtraction(배경 추출) (2) | 2021.08.16 |
(7) OpenCV python - Erosion(침식), Dilation(확장), Opening, Closing 이미지 변환 기초, 이미지 잘라내기 (0) | 2021.08.11 |
(6) OpenCV python - multi label Histogram 분석 (0) | 2021.07.30 |