[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)
# 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 함수가 호출됩니다.
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)
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:
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
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)의 형태로 읽어오기 때문입니다.
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()
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()
댓글
댓글 쓰기