1. 행렬의 복사
행렬을 복사하는 가장 간단한 방법은 복사 생성자 또는 대입 연산자를 이용하는 방법이다.
Mat img2 = img1 ; // 복사 생성자 (얕은 복사)
Mat img3;
img3 = img1 ; // 대입 연산자(얕은 복사)
픽셀 데이터를 공유하는 것이 아닌, 새로 메모리 공간을 할당하여 데이터 전체를 복사하고 싶다면, clone 함수 또는 copyTo 함수 사용
Mat Mat::clone() const;
-> Mat img4 = img1.clone(); // 깊은 복사
void Mat::copyTo(OutputArray m) const;
void Mat::copyTo(OutputArray m, InputArray mask) const;
m : 복사본이 저장될 행렬, 만약 원 행렬과 크기,타입이 다르다면 새로 메모리를 할당하여 픽셀 값을 복사
mask : 마스크 행렬, 마스크 행렬의 원소값이 0이 아닌 좌표에서만 행렬 원소를 복사
-> Mat img5;
img1.copyTo(img5); // 깊은 복사
2. 부분 행렬 추출
1. Mat 클래스에서 특정 사각형 영역의 부분 행렬을 추출하고 싶을때는 괄호 연산자 재정의 사용.
Mat Mat::operator()(const Rect&roi) const;
Mat Mat::operator()(Range rowRange, Range colRange)const;
roi : 사각형 관심 영역
rowRange : 관심 행 범위
colRange : 관심 열 범위
-> Mat img1 = imread("cat.bmp");
Mat img2 = img1(Rect(220,120,340,240)); // img1 영상의 (220,120) 좌표로부터 340x240 크기의 사각형 부분 추출
--> 마지막에 .clone() 을 붙이면 독립된 복사본 생성 가능
img2 = ~img2; // 각각의 색상 성분에 대한 반전
사각형이 아닌 임의의 모양의 ROI 설정은 마스크 행렬 필요.
2. 특정 범위의 행 또는 열을 추출하고자 하면 rowRange() 함수 또는 colRange() 함수 사용
Mat Mat::rowRange(int startrow, int endrow) const;
Mat Mat::rowRnage(const Range& r) const;
startrow : 추출할 행 범위 시작번호(포함)
endrow : 추출할 행 범위 끝번호(포함x)
r : 추출할 행 범위
colRange()함수 또한 위와 같다.
하나의 행또는 열만 추출하고자 하면 row() 또는 col() 함수 사용 // 얕은 복사
Mat Mat::row(int y) const;
Mat Mat::col(int x) const;
y : 부분 행렬로 추출할 행 번호
x : 부분 행렬로 추출할 열 번호
'컴퓨터 비전 study' 카테고리의 다른 글
Open CV Vec와 Scalar 클래스 (0) | 2020.02.26 |
---|---|
OpenCv Mat 클래스(3) (0) | 2020.02.26 |
OpenCV Mat 클래스(1) (0) | 2020.02.14 |
OpenCV 기본 자료형 클래스 (0) | 2020.02.14 |
Open CV 개요와 기초 사용법 (0) | 2020.02.14 |