본문 바로가기

컴퓨터 비전 study

Open CV Mat 클래스(2)

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