728x90
반응형
Mini Project : 반 자동 문서 스캐너 구현하기
1. 마우스 이벤트 등록
이미지 변형 중에서 이미지의 특정 지점에 대한 좌표를 가져왔었다. 이 전까지는 그림판을 이용했다면 cv2의 다양한 마우스 이벤트의 종류를 이용해 좌표를 출력할 수 있다.
cv2.EVENT_LBUTTONDOWN : 마우스 왼쪽 down
cv2.EVENT_LBUTTONUP : 마우스 왼쪽 up
cv2.EVENT_RBUTTONDOWN : 마우스 오른쪽 down
cv2.EVENT_LBUTTONUP : 마우스 오른쪽 up
cv2.EVENT_LBUTTONDBLCLK : 마우스 왼쪽 더블클릭
cv2.EVENT_RBUTTONDBLCLK : 마우스 오른쪽 더블 클릭
cv2.EVENT_MOUSEMOVE : 마우스 이동
이미지를 출력하기 전에 cv2.namedWindow()를 이용해 이벤트를 실행할 창(window)을 정의한다.
cv2.namedWindow(windowName)
이벤트를 실행할 창을 만들고 나면 해당 창에서 마우스를 실행할 핸들러를 cv2.setMouseCallback()으로 적용한다.
cv2.setMouseCallback(windowName, Mouse)
※ 여기서 cv2.namedWindow()와 cv2.setMouseCallback()에서 윈도우 이름은 cv2.imshow()에서 정의하는 윈도우이름과 동일해야 한다. 만약 윈도우 이름이 다르면 각각 다른 이름의 창이 생성되면서 이벤트가 적용되지 않는다.
위 과정을 거친 후, 이미지를 출력하기 위한 과정(imshow, waitKey, destroyAllWindows)을 모두 실행하면 마우스 이벤트 등록이 완료된다. 이를 바탕으로 마우스 왼쪽버튼을 눌렀다 때는 이벤트를 확인하고 x, y 좌표 모두 확인해 볼 수 있다.
import cv2
img = cv2.imread("poker.jpg")
def mouse_handler(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print("왼쪽 버튼 down")
print(x, y)
elif event == cv2.EVENT_LBUTTONUP:
print("왼쪽 버튼 up")
print(x, y)
# 마우스 이벤트를 처리하기 위한 핸들러가 적용될 window 정의
cv2.namedWindow("event window")
# 적용할 핸들러 불러오기
cv2.setMouseCallback("event window", mouse_handler)
cv2.imshow("event window", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
왼쪽 버튼 down
왼쪽 버튼 up
972 214
왼쪽 버튼 down
왼쪽 버튼 up
585 611
왼쪽 버튼 down
왼쪽 버튼 up
1269 478
마우스 왼쪽 up, down 뿐만 아니라 마우스 오른쪽의 up, down 그리고 더블클릭과 마우스 움직임도 정의할 수 있다. 더블클릭의 경우 마우스 이벤트가 up, down을 분리하여 생각하기 때문에 더블클릭에서 첫 번째 클릭은 down - up이며 다음 클릭은 double click - up이라고 할 수 있다.
def mouse_double(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
print("마우스 왼쪽 더블 클릭")
elif event == cv2.EVENT_LBUTTONDOWN:
print("마우스 왼쪽 down")
elif event == cv2.EVENT_LBUTTONUP:
print("마우스 왼쪽 up")
img = cv2.imread("poker.jpg")
cv2.namedWindow("event window")
cv2.setMouseCallback("event window", mouse_double)
cv2.imshow("event window", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
-- 마우스 왼쪽을 더블 클릭한 경우
마우스 왼쪽 down
마우스 왼쪽 up
마우스 왼쪽 더블 클릭
마우스 왼쪽 up
728x90
반응형
'Study > ML | DL' 카테고리의 다른 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 이진화(Binarization), TrackBar (0) | 2023.06.07 |
---|---|
[Python] OpenCV를 이용한 반 자동 문서스캐너 구현하기2 - 반 자동 문서 스캐너 구현 (0) | 2023.06.01 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 변형(흑백, 흐림, 원근) (1) | 2023.05.24 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 처리 (0) | 2023.05.19 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 크기 조정 (0) | 2023.05.18 |