[OpenCV] 마우스

6952 단어 pythonTILopencvTIL

마우스 사용해서 이미지에 주석

OpenCV에는 왼쪽 클릭 및 오른쪽 클릭과 같은 다양한 마우스 동작을 감지하는 마우스 이벤트 감지 기능이 있다. 일단 이미지에서 마우스를 사용하여 사각형을 렌더링을 해보자.

  • 마우스 이벤트를 사용해서 왼쪽 버튼이 눌리면 누른 위치에 대한 정보 저장, 누른걸 놓으면 또 한번 위치 저장해서 사각형 그리기.

  • 사용자가 q 키(ASCII 코드: 113)를 눌러 응용 프로그램 스크립트를 종료할 때까지 이미지를 계속 표시하게 while 루프를 사용한다. 사용자가 루프를 종료하면 창을 파괴.

  • 사용자가 이전 주석을 모두 지울 수 있도록 루프 안에서 c키(ASCII 코드: 99)를 누르면 창의 이미지를 원본 이미지를 읽을 때 만들어진 복사본으로 재설정된다.


이미지에 사각형 그리는 콜백 함수

코드

import cv2

# 사각형 그리는데 사용하는 두 개의 점 저장할 리스트
top_left_corner = []
bottom_right_corner = []

def drawRectangle(action, x, y, flags, *userdata):
  # 전역 변수 참조
  global top_left_corner, bottom_right_corner
  
  # 왼쪽 마우스 버튼을 눌렀을 때 왼쪽 상단 모서리 리스트에 현재 위치 저장
  if action == cv2.EVENT_LBUTTONDOWN:
    top_left_corner = [(x,y)]
    
  # 마우스 왼쪽 버튼을 놓으면 오른쪽 아래 모서리 리스트에 현재 위치 저장
  elif action == cv2.EVENT_LBUTTONUP:
    bottom_right_corner = [(x, y)]    
    
    # 사각형 그리기
    cv2.rectangle(image, top_left_corner[0], bottom_right_corner[0], (0,255,0),2,8)
    cv2.imshow("Window", image)

setMouseCallback()

setMouseCallback(winname, onMouse, userdata)
  • winname : 창의 이름
  • onMouse : 마우스 이벤트에 대한 콜백 기능
  • userdata : 콜백에 전달된 선택적 매개 변수

코드

# 이미지 읽기
image = cv2.imread("../Input/sample.jpg")

# 그린걸 지우는 데 유용하게 임시 이미지를 만들기
temp = image.copy()

# 이름있는 창 만들기
cv2.namedWindow("Window")

# 마우스 이벤트가 발생할 때 호출되는 GUI 기능
cv2.setMouseCallback("Window", drawRectangle)

키 이벤트

q키를 누르면 창이 닫히고 c키를 누르면 그려진 사각형 초기화

코드

k = 0
while k != 113:
  cv2.imshow("Window", image)
  k = cv2.waitKey(0)
  if k == 99:
    image = temp.copy()
    cv2.imshow("Window", image)
cv2.destroyAllWindows()

결과


좋은 웹페이지 즐겨찾기