[opencv-python] 마우스 클릭으로 ROI 영역 추출하기


ROI 영역을 추출하는 예제를 알아보겠습니다.




이미지 불러오기

import cv2

# ROI 좌표를 저장할 list
points = list()
img = cv2.imread("image/cat.jpg")

cv2.namedWindow('img')
cv2.setMouseCallback('img', on_mouse)
cv2.imshow("img", img)

cv2.setMouseCallback(windowName, callback, param=None)

Notes

Mouse Event를 확인하고 Callback을 호출하는 함수입니다.
windowName이 img인 윈도우에서 마우스 이벤트가 발생하면 on_mouse 함수가 호출됩니다.



Mouse Event 함수 선언

def on_mouse(event, x, y, flags, param):
     if event == cv2.EVENT_LBUTTONDOWN:
         points.append([x, y])
         print(points)

on_moise(event, x, y, flags, param)

마우스 이벤트 발생시 호출될 함수를 정의합니다.

cv2.EVENT_LBUTTONDOWN

왼쪽 마우스 버튼을 누르고 있을 때 발생

points.append([x, y])

왼쪽 마우스 버튼을 누를 때의 좌표를 points에 저장합니다.



이미지 ROI 설정

while True:
     if len(points) == 2:
        x = points[0][0]
        y = points[0][1]
        ROI = img[y:points[1][1], x:points[1][0]]
        break 
     cv2.waitKey(30)

cv2.imshow("ROI", ROI)
cv2.waitKey()

if len(points) == 2

points의 길이가 2라면 [start_x, start_y], [end_x, end_y] 좌표가 저장되었다는 의미
x == width
y == height

ROI = img[y:points[1][1], x:points[1][0]]

start_y:end_y, start_x:end_x 까지의 ROI 영역 설정

Notes

ROI 영역을 y, x로 설정하는 이유는 480x360(width, height) 픽셀의 이미지를
opencv-python에서는 360, 480 (height, width)의 형태로 읽어오기 때문입니다.

python image shape

img.shape = (360, 480, 3)

window image.jpg 속성




전체코드

import cv2

def on_mouse(event, x, y, flags, param):
      if event == cv2.EVENT_LBUTTONDOWN:
          points.append([x, y])
          print(points)


points = list()
img = cv2.imread("image/cat.jpg")

cv2.namedWindow('img')
cv2.setMouseCallback('img', on_mouse)
cv2.imshow("img", img)

while True:
     if len(points) == 2:
        x = points[0][0]
        y = points[0][1]
        ROI = img[y:points[1][1], x:points[1][0]]
        break 
     cv2.waitKey(30)

cv2.imshow("ROI", ROI)
cv2.waitKey()


참고문헌

[1] https://opencv-python.readthedocs.io/en/latest/doc/04.drawWithMouse/drawWithMouse.html [2] https://webnautes.tistory.com/1219

댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)

[python] selenium close와 quit 차이점