본문 바로가기

# 미사용/OpenCV

[OpenCV] 행렬의 영역참조 (관심영역)


 행렬 메모리 요약

서로 다른 Mat (= 행렬 헤더) 객체는

  • 같은 행렬 메모리를 공유할 수 있고,

  • 다른 행렬 메모리를 가르킬 수 있다.




 관심 영역 (ROI - Region Of Interest)

어떤 행렬 메모리의 부분 행렬 메모리.

쉽게 말하자면, 보고 싶은 영역만 본다는 것 이다.


이 때, Mat을 수정하게 된다면,

당연히 원본 행렬 메모리에도 수정이 가해진다.




 Range를 통한 범위 지정

관심영역을 생성하기 전에 Range 클래스에 대해 알아야 한다.


Range 클래스는 1차원 영역에서 범위를 지정하며,

[srt, end) 구간표현을 사용한다.



여기서 Range가 2개 모이면,

2차원 영역에서 범위를 지정할 수 있다.

  • x축 방향에서 하나.

  • y축 방향에서 하나.



 관심영역 생성

행렬 헤더와 Range 클래스 2개가 모이면,

관심영역의 행렬 헤더를 얻을 수 있다.


example)

//! data = [0, 25)
vector<int> data;
for(int i=0; i<25; i++){
    data.push_back(i);
}


//! Mat를 생성한다.
Mat mat = Mat(data, true);                      //! [1 x 25]
mat.create(Size(5, 5), CV_32SC1); //! [5 x 5]


//! ROI를 지정한다.
Range y_range(1, 3);
Range x_range(3, 5);
Mat roi = mat(y_range, x_range);
/*
 * [ 8,  9;
 *  13, 14]
 */


//! ROI를 수정한다.
roi.at<int>(0, 0) = 99;
roi.at<int>(0, 1) = 99;
roi.at<int>(1, 0) = 99;
roi.at<int>(1, 1) = 99;
/*
 * [99, 99;
 *  99, 99]
 */


//! mat를 출력한다.
cout << mat << '\n';
/*
 * [ 0,  1,  2,  3,  4;
 *   5,  6,  7, 99, 99;
 *  10, 11, 12, 99, 99;
 *  15, 16, 17, 18, 19;
 *  20, 21, 22, 23, 24]
 */



 관심영역 크기 변경하기

Mat::adjustROI( ) 메서드와 4가지 파라미터를 통해 관심영역을 조정할 수 있다.

  • 윗 방향에서의 변화량.

  • 아랫 방향에서의 변화량.

  • 왼쪽 방향에서의 변화량.

  • 오른쪽 방향에서의 변화량. 



해설하자면,

  • 위는 역방향으로 1만큼 이동해야 하므로 -1.

  • 아래는 정방향으로 3만큼 이동해야 하므로 +3.    +2

  • 왼쪽은 정방향으로 2만큼 이동해야 하므로 +2.

  • 오른쪽은 역방향으로 1만큼 이동해야 하므로 -1.



 참조 정보 가져오기

Mat::locateROI( ) 메서드를 통해,

아래의 행렬 메모리 정보를 얻어올 수 있다.

  • 행렬 메모리 크기, (Size형)

  • 관심영역의 시작점이 행렬 메모리의 어느 위치인지, (Point형)


주의해야 할 점이 있다.

예를 들어, 아래와 같이 정의했을 때.

  • 1차 ROI     : 원본에서 ROI를 취함.

  • 2차 ROI     : 1차 ROI에서 다시 ROI를 취함.


2차의 행렬 메모리 크기는, 1차의 ROI 영역의 크기가 아니다.

영역의 크기가 아니라, 행렬 메모리의 크기인 것이다.


둘 다, 같은 행렬 메모리를 공유하므로,

2개의 행렬 메모리의 크기는 같다.




'# 미사용 > OpenCV' 카테고리의 다른 글

[OpenCV] 이미지 입출력  (0) 2019.10.29
[OpenCV] 벡터를 행렬로 변환  (0) 2019.10.29
[OpenCV] 행렬의 생성 및 활용  (0) 2019.10.29
[OpenCV] 기본 클래스 활용  (0) 2019.10.28
[OpenCV] 기본 클래스 생성  (0) 2019.10.28