Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

OpenCV(C++)에서 관심 영역(ROI)은 어떻게 작동할까?

이미지에서 특정 부분을 분리하려면 먼저 해당 영역의 위치를 파악해야 합니다. 이후 원본 이미지에서 그 영역을 복사해 별도의 행렬(Matrix)에 저장하게 되는데, 이것이 바로 OpenCV에서 ROI(Region of Interest, 관심 영역)가 동작하는 방식입니다.

ROI 추출의 기본 원리

이번 예제에서는 가장 먼저 두 개의 행렬을 선언합니다. 그다음 'image_name.jpg'라는 이미지를 'image1' 행렬에 불러옵니다. 여기서 주목해야 할 코드가 바로 다음 줄입니다.

image2 = image1(Rect(100, 100, 120, 120));

이 한 줄이 핵심입니다. 지정한 좌표 범위만큼 이미지 영역을 잘라내어(crop) 'image2' 행렬에 저장하는 역할을 수행합니다.

Rect 함수의 구조 이해하기

OpenCV(C++)에서 관심 영역(ROI)은 어떻게 작동할까?

위 그림은 '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;
}

실행 결과

OpenCV(C++)에서 관심 영역(ROI)은 어떻게 작동할까?

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