행렬 메모리 요약
서로 다른 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 |