[OpenCV] Mat 클래스 – 4. 행렬 연산, 변환

마지막으로 Mat 클래스의 연산과 변환에 대해 알아보겠습니다.

OpenCV에서는 Mat 클래스의 표현과 연산을 위한 기능도 제공하고있습니다.
mat.hpp에 보면 아래 그림과 같이 +, -, *, / 뿐만 아니라 비교, 논리 연산도 제공합니다.

MatExpr은 OpenCV의 Mat 클래스의 연산을 할 때 사용되는 클래스입니다.
Mat뿐만 아니라 Scalar 클래스도 연산에 가능하며 int, float같은 자료형도 사용 가능합니다.

행렬의 곱은 아래 mul 함수로 사용 가능합니다.

MatExpr mul(InputArray m, double scale=1) const;

역행렬을 구할 땐 아래 inv함수를 사용합니다.

MatExpr inv(int method=DECOMP_LU) const;

행렬의 행과 열을 교환하는 전치 행렬은 t함수를 사용합니다.(MxN 함수를 NxM으로 변경)

MatExpr t() const;

위 함수들의 예제 코드는 아래와 같습니다.

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main()
{
	float afMat[] = { 1,2,3,4 };
	Mat mat_1( 2, 2, CV_32FC1, afMat );
	cout << "mat_1 : \n" << mat_1 << endl;

	Mat mat_2 = mat_1.inv();
	cout << "mat_2 : \n" << mat_2 << endl;

	cout << "mat_1.t() : \n" << mat_1.t() << endl;
	cout << "mat_2 + 5 : \n" << mat_2 + 5 << endl;

return 0;
}

행렬의 타입을 변환하기 위해서는 아래 convertTo 함수를 사용합니다.

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

convertTo 함수는 CV_8UC1을 CV_32FC1으로 변경 가능 하고 uchar 형을 float, double 형으로도 변환 가능합니다.

행렬의 크기 또는 채널수를 변경할 때 reshape함수를 사용합니다.

Mat reshape(int cn, int rows=0) const;

Mat reshape(int cn, int newndims, const int* newsz) const;

Mat reshape(int cn, const std::vector<int>& newshape) const;