본문 바로가기
Computer Vision

OpenCV 주요 클래스 - 2. Mat 클래스(4)

by ksb0511 2020. 2. 13.

6. 행렬 정보 참조하기

  • Mat::data 멤버 변수는 행렬 원소 데이터가 저장되어 있는 메모리 공간의 시작 주소를 가리키는 포인터.
  • Mat 클래스 정보 참조를 위한 멤버 함수
Mat 클래스 멤버 함수 설명
int Mat::channels() const; 행렬의 채널 수를 반환
int Mat::depth() const; 행렬의 깊이를 반환합니다. (예) CV_8U
size_t Mat::elemSize() const; 한 개의 원소가 차지하는 메모리 크기를 바이트 단위로 반환
size_t Mat::elemSize1() const; 하나의 채널에서 한 개의 원소가 차지하는 메모리 크기를 바이트 단위로 반환
bool Mat::empty() const; 비어 있는 행렬이면 true를 반환
bool Mat::isContinuous() const; 각 행의 원소가 연속적으로 저장되어 있으면 true를 반환
bool Mat::isSubmatrix() const; 행렬이 다른 행렬의 부분 행렬이면 true를 반환
Size Mat::size() const; 행렬 크기를 Size 타입으로 반환
size_t Mat::total() const; 전체 원소 개수를 반환
int Mat::type() const; 행렬의 타입을 반환

// Mat 객체에 int, float, double 같은 자료형의 행렬이 저장되어 있는 경우, 행렬 원소를 출력하는 기능
static inline
std::ostream& operatore << (std:: ostream& out, const Mat& mtx)

 

  • out 인자에 C++ 표준 출력 스트림 객체 값을 넣음.
  • C++ 표준출력 스트림 객체 참조를 반환.

7. 행렬 연산

  • MatExpr 타입은 OpenCV에서 행렬 연산을 표현하는 용도로 사용되는 행렬 표현식 클래스
// 두 행렬에서 같은 위치에 있는 원소끼리 곱셈 연산 수행
MatExpr Mat::mul(InputArray m, double scale=1) const;

 

  • m은 *this 행렬과 크기 및 타입이 같은 행렬을 의미
  • scale에는 추가적으로 곱할 값을 넣음.

// 역행렬 구하기
MatExpr Mat::inv(int method = DECOMP_LU) const;

 

  • method는 역행렬 계산 방법을 의미.
  • method에 DECOMP_LU, DECOMP_SVD, DECOMP_EIG, DECOMP_CHOLESKY 중 하나를 지정할 수 있음.

// 전치행렬 구하기
MatExpr Mat::t() const;

 

  • 입력 행렬이 정방행렬일 경우 행과 열의 위치만 바꿔주면 됨.
  • 입력 행렬의 크기가 M x N 일 경우 전치 행렬의 크기는 N x M 으로 변경 됨.

8. 크기 및 타입 변환 함수

// 행렬의 타입을 변경
void Mat::convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

 

  • 추가적으로 모든 원소에 일정한 값을 더하거나 곱할 수 있음.
  • 출력 행렬인 m의 원소 값은 다음 수식에 의해 결정

  • rtype : 원하는 출력 행렬의 타입을 입력. 만약 rtype이 음수일 경우 출력 행렬은 입력행렬과 같은 타입.

// 주어진 행렬 크기 또는 채널 수를 변경
Mat Mat::reshape(int cn, int rows=0) const;

 

  • 새로운 행렬을 만드는 것이 아닌 하나의 행렬 원소 데이터를 같이 참조하는 행렬을 반환.
  • 반환된 행렬 원소 값을 변경할 시 원본 행렬의 원소 값도 함께 바뀜.

// 행렬의 모양 변경이 아닌, 행렬의 행 크기를 변경
void Mat::resize(size_t sz);
void Mat::resize(size_t sz, const, Scalar& s);

 

  • sz는 새로운 행 갯수를 의미하며, s는 새로 추가되는 행 원소의 초깃값을 의미한다.
  • sz가 기존 행렬의 행 개수보다 작으면 아래쪽 행을 제거, 크면 아래쪽에 행을 추가.

// 이미 존재하는 행렬에 원소 데이터를 추가하고 싶을 때
template<typename _Tp> void Mat::push_back(const _Tp& elem);		// *this 행렬은 1열짜리 행렬이어야 함.
template<typename _Tp> void Mat::push_back(const Mat_<_Tp>& elem);			// *this 행렬과 인자로 전달된 m 행렬의 열 개수 동일해야 함.
template<typename _Tp> void Mat::push_back(const std::vector<_Tp>& elem);		// *this 행렬은 1열짜리 행렬이어야 함.
void Mat::push_back(const Mat& m);			// *this 행렬과 인자로 전달된 m 행렬의 열 개수 동일해야 함.

 

  • elem : 행렬의 맨 마지막 행에 추가할 원소 데이터
  • m : 행렬의 맨 마지막 행에 추가할 행렬을 의미, *this와 타입, 열 갯수 같아야 함.

// 행렬에서 맨 아래 있는 행을 제거할 때
void Mat::pop_back(size_t nelems=1);

 

  • 제거할 행의 갯수가 *this 행렬의 행 갯수보다 크면 안됨.

 

 

댓글