-
[OpenCV 튜토리얼] 5. 관심영역 ROI(Region Of Interest)Python/OpenCV 2020. 11. 24. 09:55SMALL
ROI는 뜻 그대로 이미지나 영상 내에서 내가 관심있는 부분을 뜻한다.
이미지 상의 특정 오브젝트나 특이점을 찾는 것을 목표로 할 때 쓴다.
(비슷한 용어로는 COI(Channel Of Interest)라는 관심 채널이 있다.)
이미지나 영상을 처리할 때 관심영역(ROI)를 지정하는 것은 매우 중요하다.
관심영역을 지정하는 것은 불필요한 영역에 대한 이미지 처리를 방지할 수 있어 여러 리소스를 절약할 수 있다.
OpenCV에서는 selectROI 함수와 selectROIs 함수를 이용해 관심영역을 지정할 수 있다.
1. ROI의 평균값으로 이미지 나타내기
import cv2 import numpy as np src = cv2.imread("C:\\Users\\user\\Desktop\\img.jpg") dst = np.zeros(src.shape, dtype=src.dtype) N = 256 height, width, _ = src.shape h = height // N w = width // N for i in range(N): for j in range(N): y = i * h x = j * w roi = src[y:y + h, x:x + w] dst[y:y + h, x:x + w] = cv2.mean(roi)[0:3] cv2.imshow('dst', dst) cv2.waitKey() cv2.destroyAllWindows()
src로 원본 이미지의 속성을 받아온 뒤, src의 크기와 데이터 타입과 같은 0으로 채워진 dst를 생성해준다.
나눌 블록의 크기를 w * h로 설정하고 x, y는 왼쪽 상단부터의 좌표를 나타낸다.
roi = src[y:y + h, x:x + w]는 원본 영상의 ROI를 계산해 그 평균값을 계산한다.
평균값을 타나내는 것으로 N의 값이 커질수록 원본 영상과 비슷해지고 N이 작을수록 원본 영상의 전체 평균 값과 비슷해져 구분하기 어려워진다.
2. 마우스로 ROI 영역 나타내기
import cv2 src = cv2.imread('C:\\Users\\user\\Desktop\\img.jpg') roi = cv2.selectROI(src) print('roi = ', roi) img = src[roi[1]:roi[1] + roi[3], roi[0]:roi[0] + roi[2]] cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows()
이미지가 생성된 뒤 원하는 영역을 마우스로 클릭하게 되면 해당 영역만 선택되어 새로운 이미지가 생성된다.
그 후 생성된 이미지들을 모두 종료하면 해당 영역의 ROI 값이 출력되게 된다.
3. 마우스로 다중 ROI 영역 나타내기
import cv2 src = cv2.imread('C:\\Users\\user\\Desktop\\img.jpg', cv2.IMREAD_GRAYSCALE) rects = cv2.selectROIs('src', src, False, True) print('rects: ', rects) for r in rects: cv2.rectangle(src, (r[0], r[1]), (r[0] + r[2], r[1] + r[3]), 255) cv2.imshow('src', src) cv2.waitKey() cv2.destroyAllWindows()
cv2.selectROIs('src', src, False, True) src라는 생성된 이미지에 격자 표시 안함(False), 마우스 클릭 위치에서 드래그하여 박스 선택(True)을 설정해준다.
하나의 박스를 생성한 후, 엔터를 누르고 또 다른 박스를 생성하고 esc를 누르면 선택한 다중 영역이 화면에 표시되고
해당 영역의 ROI값이 출력된다.
[참고 문헌]
1. OpenCV reference
2. 김동근(2018), "Python으로 배우는 Open CV 프로그래밍", 가메출판사
LIST'Python > OpenCV' 카테고리의 다른 글
[OpenCV 튜토리얼] 4. 마우스 및 트랙바 이벤트 처리 (0) 2020.11.17 [OpenCV 튜토리얼] 3. 도형 그리기 및 문자열 출력하기 (0) 2020.11.17 [OpenCV 튜토리얼] 2. 비디오 캡쳐와 화면 표시 (0) 2019.07.09 [OpenCV 튜토리얼] 1. OpenCV 영상(이미지) 입출력 (0) 2019.06.17 댓글