본문 바로가기
Python/Computer Vision

[파이썬, Python] OpenCV - 관심영역(ROI)

by coding-choonsik 2023. 8. 25.
728x90
반응형
SMALL

1. 관심 영역(ROI, Region of Interest)

  • 영상 내에서 관심이 있는 영역
  • cv2.selectROI(창이름, 영상, 중앙에서 시작할지에 대한 여부=False)
  • 중앙에서 시작할지에 대한 여부가 True일 경우 선택한 ROI 중앙좌표로 계산
  • 기본값은 False이고 왼쪽상단으로 좌표 계산

✅ 다음 그림에서 해 부분을 ROI로 설정하여 합성하고 사각형 그리기(해가 떠있는 부분의 좌표값으로)

import cv2

img = cv2.imread('sun.jpg')
x = 180
y = 17
w = 125
h = 120
roi = img[y: y+h, x: x+w]
img2 = roi.copy()
# print(roi.shape)
img[y:y+h, w+x:x+w+w] = roi

cv2.rectangle(img, (x, y),(x+w+w, y+h), (0, 255, 0), 2)

# cv2.rectangle(img, (180, 17, 125, 120), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.imshow('roi', img2)
cv2.waitKey()

▲ img
▲ roi


 

✅ ROI를 설정할 부분을 마우스 드래그로 설정

import cv2
import numpy as np
# sun.jpg 사진에서 원하는 ROI 부분을 마우스로 선택하고 선택된 ROI를 창으로 출력

isDrag = False
oldx = oldy = w = h = 0
color = (255, 0, 0)
img_copy = None

def on_mouse(event, x, y, flags, param):
    global oldx, oldy, w, h, isDrag, img_copy
    # 마우스 왼쪽을 눌렀을 때
    if event == cv2.EVENT_LBUTTONDOWN:
        isDrag = True
        oldx = x
        oldy = y
    elif event == cv2.EVENT_MOUSEMOVE:
        if isDrag:
            img_copy = img.copy()
            cv2.rectangle(img_copy, (oldx, oldy), (x, y), color, 3)
            cv2.imshow('img', img_copy)
    elif event == cv2.EVENT_LBUTTONUP:
        if isDrag:
            isDrag = False
            w = x - oldx
            h = y - oldy
            if w > 0 and h > 0 :
                cv2.rectangle(img_copy, (oldx, oldy), (x, y), color, 3)
                cv2.imshow('img', img_copy)
                roi = img[oldy:oldy+h, oldx: oldx+w]
                cv2.imshow('roi', roi)
        else:
            cv2.imshow('img', img)
            print('영역이 잘못되었음!')


img = cv2.imread('sun.jpg')
cv2.imshow('img', img)
cv2.setMouseCallback('img', on_mouse)
cv2.waitKey()

▲ 마우스 드래그를 통해 ROI설정

 

▲roi

 

✅ selectROI로 간단하게 작성

import cv2

img  = cv2.imread('sun.jpg')

# from_center= False: 중심부터가 아니라 내가 찍어준데부터 ROI시작
x, y, w, h = cv2.selectROI('img', img, False)
if w and h:
    roi = img[y:y+h, x:x+w]
    cv2.imshow('roi', roi)

cv2.waitKey()

▲ 마우스 드래그를 통해 ROI설정
▲roi

 

 

 

728x90
반응형
LIST