intmain() { //행, 열, 데이타 타입 순이다. Mat mtx(3, 3, CV_32F); //3x3 32비트 float 타입의 매트릭스 Mat cmtx(10, 1, CV_64FC2); //10x1 2ch floating Mat img(Size(5, 3), CV_8UC3); //3ch image
//생성후 선언 Mat mtx2; mtx2 = Mat(3, 3, CV_32F); Mat cmtx2; cmtx2 = Mat(10, 1, CV_64FC1);
//포인터 이용 Mat* mtx3 = newMat(3, 3, CV_32F); delete mtx3;
위의 코드를 보았듯이 행렬의 곱은 각 요소의 곱이 아닌 행렬곱으로 정의되어있으며 각 요소끼리 곱셈이 필요한 경우 mul()을 이용한다. 위에서 주의할 점은 m2처럼 배열을 이용해서 Mat을 만든경우 Mat의 값을 변경시 배열의 값이 변하며, 반대로 배열의 값을 변경시 Mat의 값도 변한다는 점이다. m2가 배열 dm을 참조하고 있기 때문이다.
역행렬
숫자에 있어서 곱셈 항등원인 1을 만드는 역수가 존재하듯이, 행렬에도 단위행렬을 만드는 역행렬이 존재한다. A행렬의 역행렬을 B라고 하였을때 A와 B를 행렬곱하면 단위행렬인 E가 나온다. 숫자 a의 역수를$$a^{-1}$$ 로 나타내듯이 행렬 A에 대한 역행렬은 $$A^{-1}$$ 로 나타낸다. 이 역행렬을 구하는 방법은?
1 2
Mat m; m.inv(); //행과 열이 같지 않은 경우 에러 발생
전치행렬
전치 행렬(transposed matrix)은 행과 열을 교환하여 얻는 행렬로 대각선을 주축으로 하는 반사 대칭을 가하여 얻는 행렬로 $$A^T$$ 로 표현한다.
/* Mat image (ROW, COL, CV_TYPE); image.at (WANT_ROW, WANT_COL); - ROW: Row - COL: Column - CV_TYPE: data type ( for example : CV_8UC3 = 8 bit 3 channels) - DATA_TYPE: Mat creation data type ( for example : float, usigned char) - WANT_ROW: access to the desired row - WANT_COL: access to the desired column */
//at접근 방법 예 //img.at< 원하는 자료형>(row좌표,col좌표)[채널(여기선 rgb 3ch라 0~2)] //Vec3b means 'uchar 3ch' unsignedchar b = img.at< cv::Vec3b>(i, j)[0]; unsignedchar g = img.at< cv::Vec3b>(i, j)[1]; unsignedchar r = img.at< cv::Vec3b>(i, j)[2];
/* Mat image (ROW, COL, CV_TYPE); image.ptr (WANT_ROW, WANT_COL); (This access is changed to the Point) - ROW: Row - COL: Column- CV_TYPE: data type ( for example : CV_8UC3 = 8 bit 3 channels) - DATA_TYPE: Mat creation data type ( for example : float, usigned char) - WANT_ROW: access to the desired row - WANT_COL: access to the desired column */ //using ptr for (int i = img.rows / 10 * 5; i < img.rows / 10 * 6; i++) {
//포인터 받아오는 부분 유심히. cv::Vec3b* ptr = img.ptr< cv::Vec3b >(i);
/* Mat image (ROW, COL, CV_TYPE); DATA_TYPE * data = (DATA_TYPE *) image.data;data [WANT_ROW * image.cols + WANT_COL] - ROW: Row - COL: Column - CV_TYPE: data type ( for example : CV_8UC3 = 8 bit 3 channels) - DATA_TYPE: Mat creation data type ( for example : float, usigned char) - WANT_ROW: access to the desired row - WANT_COL: access to the desired column */ //using data for (int i = img.rows / 10 * 7; i < img.rows / 10 * 8; i++) { for (int j = 0; j < img.cols; j++) {
printf("/////////////////////////////////////////////////////////////\n"); printf("//vector to Mat\n"); int r=3; int c=4;
vector< float> Vf;
//insert value 초기화 int cnt=0; for(int i=0; i< c; ++i) for(int j=0; j< r; ++j) Vf.push_back(cnt++);
//Mat 생성 Mat M=Mat(r,c,CV_32FC1); //vector 크기와 동일한 mat생성
//vector to mat 부분. //M.data : MAt의 값을 나타내는 배열의 첫번째 포인터 memcpy(M.data,Vf.data(),Vf.size()*sizeof(float));
//print Mat cout < < M < < endl;
printf("/////////////////////////////////////////////////////////////\n"); printf("//Mat to vector\n"); vector< float> Vf2; //copy mat to vector부분 Vf2.assign((float*)M.datastart, (float*)M.dataend);