[OpenCV] 마우스 클릭으로 이미지에서 ROI 자르기 [1]

소개



OpenCV를 이용하여 마우스 클릭 이벤트를 연습해 보았습니다.

하고 싶은 일



1. 이미지 위로 마우스로 4곳을 클릭합니다. (왼쪽의 녹색 포인트)
2. 그 네 곳의 안쪽 부분을 잘라내어 다른 이미지로 표시합니다. (오른쪽)



방법 설명



OpenCV의 마우스 클릭 이벤트를 이용합니다.

마우스 커서가 선택하는 좌표를 포함하는 circles 배열을 선언
마우스 클릭을 계산하는 counter 변수 선언
마우스 왼쪽 클릭을 감지하면 이미지 좌표를 circles[]에 저장하는 함수를 정의합니다.

import cv2
import numpy as np

circles = np.zeros((4,2), np.int)
print(circles)
counter = 0

def mousePoints(event, x, y, flags, params):
    global counter
    if event == cv2.EVENT_LBUTTONDOWN:
        print(x,y)
        circles[counter] = x,y
        counter = counter + 1
        print(circles)


이미지 처리 부분.
OpenCV의 PerspectivTransform을 이용하여 마우스로 선택된 부분을 warp 처리한다.
마우스를 4회 클릭했을 때만 처리를 실시한다.

while True:

    if counter ==4 :
        width , height = 250, 350
        pts1 = np.float32([circles[0],circles[1],circles[2],circles[3]])
        pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])
        matrix = cv2.getPerspectiveTransform(pts1,pts2)
        imgoutput = cv2.warpPerspective(img, matrix,(width, height))
        cv2.imshow('Output image', imgoutput)

    for x in range(0, 4):
        cv2.circle(img, (circles[x][0], circles[x][1]), 3, (0, 255, 0), cv2.FILLED)


전체 코드


import cv2
import numpy as np

circles = np.zeros((4,2), np.int)
print(circles)
counter = 0

def mousePoints(event, x, y, flags, params):
    global counter
    if event == cv2.EVENT_LBUTTONDOWN:
        print(x,y)
        circles[counter] = x,y
        counter = counter + 1
        print(circles)


img = cv2.imread('lena.png')

while True:

    if counter ==4 :
        width , height = 250, 350
        pts1 = np.float32([circles[0],circles[1],circles[2],circles[3]])
        pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])
        matrix = cv2.getPerspectiveTransform(pts1,pts2)
        imgoutput = cv2.warpPerspective(img, matrix,(width, height))
        cv2.imshow('Output image', imgoutput)

    for x in range(0, 4):
        cv2.circle(img, (circles[x][0], circles[x][1]), 3, (0, 255, 0), cv2.FILLED)

    cv2.imshow('Original image', img)
    cv2.setMouseCallback('Original image', mousePoints)

    cv2.waitKey(1)

참고 자료



Bounding Box를 이용하는 방법의 내용도 게재했습니다.
[OpenCV] 마우스 클릭으로 이미지에서 ROI 자르기 [2]

좋은 웹페이지 즐겨찾기