728x90
728x90
cv2.selectROI가 아닌 이벤트 핸들러(MouseCallback)를 이용한 구현임.
x button (or close button)을 지원하기 위한 구현을 추가한 것이며, 여러 윈도우를 띄우는 경우엔 메인 윈도우가 닫히는 경우, 다른 윈도우들도 같이 닫히도록 처리하는 처리가 필요하여 `\text{pyautogui}`패키지를 이용하여 처리함.
import cv2
import numpy as np
import pyautogui
is_dragging = False
x0,y0 = -1,-1
w0,h0 = -1,-1
red = (0,0,255)
def onMouse(event, x, y, flags, param):
global is_dragging
global x0,y0,w0,h0
if event == cv2.EVENT_LBUTTONDOWN:
is_dragging = True
x0 = x
y0 = y
print(x0,y0)
elif event == cv2.EVENT_MOUSEMOVE:
if is_dragging:
tmp = img.copy()
cv2.rectangle(tmp, (x0,y0), (x,y), red, 2)
cv2.imshow('roied_img', tmp)
elif event == cv2.EVENT_LBUTTONUP:
if is_dragging:
is_dragging = False
w = x-x0
h = y-y0
if w>0 and h > 0:
tmp = img.copy()
cv2.rectangle(tmp, (x0,y0), (x,y), red, 3)
cv2.imshow('roied_img', tmp)
roi = img[y0:y0+h, x0:x0+w]
#roi = img[x0:x0+w, y0:y0+h]
cv2.imshow('roi', roi)
cv2.moveWindow('roi',0,0)
cv2.imwrite('./roi.png',roi)
print('roi is cropped and saved!')
else:
cv2.imshow('roied_img', img)
print('unvalid roi!. select roi carefully')
pyautogui.press('e') # main thread로 돌아가기 위한 key event 발생.
return
img = cv2.imread('/home/dsaint31/lecture/OpenCV_Python_Tutorial/images/lena.png')
cv2.imshow('roied_img', img)
cv2.setMouseCallback('roied_img',onMouse)
while cv2.getWindowProperty('roied_img', cv2.WND_PROP_VISIBLE) >= 1:
key_code = cv2.waitKey(50) # millisecond
if key_code == 27:
# print('ESC')
break;
elif cv2.getWindowProperty('roied_img', cv2.WND_PROP_VISIBLE) < 1:
# print('closed button')
break;
elif cv2.getWindowProperty('roi', cv2.WND_PROP_VISIBLE) < 1:
# print('closed button')
cv2.destroyWindow('roi')
cv2.destroyAllWindows()
ROI만 선택하는 간단한 버전이 필요하다면 다음을 참조할 것.
2022.10.03 - [Programming/DIP] - [DIP] opencv : Region of Interest (ROI) : cv2.selectROI
'Programming > DIP' 카테고리의 다른 글
[DIP] Deconvolution: Richardson-Lucy deconvolution algorithm (0) | 2022.10.11 |
---|---|
[NumPy] Fancy Indexing & Combined Indexing (1) | 2022.10.03 |
[DIP] opencv : Region of Interest (ROI) : cv2.selectROI (0) | 2022.10.03 |
[NumPy] Broadcasting (0) | 2022.09.27 |
[DIP] Signal to Noise : Amplitude, Power, and Differential SNR (0) | 2022.09.26 |