이미지에서 특정 부분을 분리하려면 먼저 해당 영역의 위치를 파악해야 합니다. 이후 원본 이미지에서 그 영역을 복사해 별도의 행렬(Matrix)에 저장하게 되는데, 이것이 바로 OpenCV에서 ROI(Region of Interest, 관심 영역)가 동작하는 방식입니다.
ROI 추출의 기본 원리
이번 예제에서는 가장 먼저 두 개의 행렬을 선언합니다. 그다음 'image_name.jpg'라는 이미지를 'image1' 행렬에 불러옵니다. 여기서 주목해야 할 코드가 바로 다음 줄입니다.
image2 = image1(Rect(100, 100, 120, 120));
이 한 줄이 핵심입니다. 지정한 좌표 범위만큼 이미지 영역을 잘라내어(crop) 'image2' 행렬에 저장하는 역할을 수행합니다.
Rect 함수의 구조 이해하기

위 그림은 'Rect(100, 100, 120, 120)' 코드가 실제로 어떤 역할을 하는지 보여줍니다. 이 코드의 기본 형식은 'Rect(x, y, x1, y1)'입니다.
- x, y: 사각형 영역의 시작점(좌측 상단) 좌표
- x1, y1: 사각형 영역의 크기(너비와 높이)
즉, 이 값들을 조정하면 원하는 위치와 크기의 사각형 영역을 자유롭게 지정할 수 있습니다.
예제 코드
아래 프로그램은 OpenCV에서 관심 영역(ROI)이 실제로 어떻게 작동하는지 보여줍니다.
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main() {
Mat image1; //'image1'이라는 이름의 행렬 선언//
Mat image2; //'image2'이라는 이름의 행렬 선언//
image1 = imread("RGB.png"); //이미지 파일을 image1 행렬에 로드//
image2 = image1(Rect(100, 100, 120, 120)); //image1에 사각형 영역 적용//
namedWindow("Image_Window1"); //원본 이미지를 표시할 윈도우 선언//
namedWindow("Image_Window2"); //ROI를 표시할 윈도우 선언//
imshow("Image_Window1", image1); //원본 이미지 출력//
imshow("Image_Window2", image2); //추출된 ROI 출력//
waitKey(0);
return 0;
}실행 결과

프로그램을 실행하면 두 개의 창이 열립니다. 첫 번째 창에는 원본 이미지 전체가 표시되고, 두 번째 창에는 Rect(100, 100, 120, 120)으로 지정한 영역만 잘려 나온 결과가 나타납니다. 이처럼 ROI 기능을 활용하면 객체 검출, 얼굴 인식 등 전처리 과정에서 필요한 영역만 손쉽게 추출할 수 있습니다.