[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]
Reference
이 문제에 관하여([OpenCV] 마우스 클릭으로 이미지에서 ROI 자르기 [1]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kotai2003/items/6c286132d36a620bc975
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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]
Reference
이 문제에 관하여([OpenCV] 마우스 클릭으로 이미지에서 ROI 자르기 [1]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kotai2003/items/6c286132d36a620bc975
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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)
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]
Reference
이 문제에 관하여([OpenCV] 마우스 클릭으로 이미지에서 ROI 자르기 [1]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kotai2003/items/6c286132d36a620bc975
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([OpenCV] 마우스 클릭으로 이미지에서 ROI 자르기 [1]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kotai2003/items/6c286132d36a620bc975텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)