Skip to main content

OpenCV : Mat class method

You can get your mat object information (dimmension, rows, cols, size ....) and resize, reshape, copy Mat object by using Mat class method.


1. Get Information of Mat object
cout << "dimmension : "<< mat7.dims << endl;
cout << "rows : "<< mat7.rows << endl;
cout << "columns : "<< mat7.cols << endl;
cout << "size : "<< mat7.size() << endl << endl;
cout << "number of total elements: " << mat7.total() << endl;
cout << "type :" << mat7.type() << endl;
cout << "depth :" << mat7.depth() << endl;
cout << "channels :" << mat7.channels() << endl;

2. Resize Mat object
Mat_ <int> mat10(2, 4);
mat10 << 1,2,3,4,5,6,7,8;
mat10.resize(1); // resize to one rowmat10.resize(2); // resize to two rowsmat10.resize(3, Scalar(9)); // resize to three rows and fill blanks to 9

3. Reshape Mat object
Reshape method just change channels and rows without change number of total elements.


Mat mm1(2, 6, CV_8U);
print_matInfo("mm1 ", mm1);
Mat mm2 = mm1.reshape(2); // change to 2 channels
print_matInfo("mm1.reshape(2) ", mm2);
Mat mm3 = mm1.reshape(3, 2); // change to 3 channels 2 rows
print_matInfo("mm1.reshape(3, 2) ", mm3);

print_matInfo is method for check change

void print_matInfo(String m_name, Mat mat){
    cout << "[" << m_name << " Matrix]" << endl;
    cout << "channels = " << mat.channels() << endl;
    cout << "rows X columns = " << mat.rows << " X " << mat.cols << endl << endl;
}

As result :
[mm1  Matrix]
channels = 1
rows X columns = 2 X 6

[mm1.reshape(2)  Matrix]
channels = 2
rows X columns = 2 X 3

[mm1.reshape(3, 2)  Matrix]
channels = 3
rows X columns = 2 X 2



 4. Copy Mat object
It is safe to use "copyTo()", "clone()", "convertTo()" method for copy.

double mData2[] = {
        1.1, 2.2, 3.3, 4.4,
        5.5, 6.6, 7.7, 8.8,
        9.9, 10, 11, 12};

Mat mmm4(3, 4, CV_64F, mData2);
Mat mmm5 = mmm4.clone(); // clone to mmm5 from mmm4 
Mat mmm6, mmm7;
mmm4.copyTo(mmm6); // copy to mmm6 from mmm4
mmm4.convertTo(mmm6, CV_8U); // copy to mmm6 and convert data type double to unsign_int


Warning : If you used '=' for copy,  it is not copy to but refer to.
Mat mmm3 = mmm4;
mData2[0] = 3.2; // it change not only mmm4 but also mmm3.
cout << "mm3 = \n" << mmm3 << endl << endl;


5. Mat Operation

cout << oneMat + douMat << endl<< endl; // addition 
cout << oneMat * douMat << endl<< endl; // matrix multiple 
cout << oneMat / douMat << endl<< endl; // devide 
cout << douMat - oneMat << endl<< endl; // subtraction
cout << oneMat.mul(2) << endl << endl;  // multiple 
cout << douMat.inv() << endl << endl; // Inverse matrix 
cout << douMat.t() << endl << endl; // Replace rows and columns

Comments

Popular posts from this blog

OpenGL SL - Show Video and Image

The simple image is made like this. void  mainImage(  out   vec4  fragColor,  in   vec2  fragCoord ){      // Normalized pixel coordinates (from 0 to 1)      vec2  uv = fragCoord/iResolution.xy;           //uv.x = uv.x - 0.3;      fragColor =  texture (iChannel0, uv); } I think GPU processing has two major steps. Normalizing and Pointing. 1. Normalizing Each pixel has screen coordinate and we need to normalizing from 0.0 to 1.0, because there are many displays with various resolutions around us. We can not manage it at each resolution. It is very troublesome. So we should normalize it :   vec2   uv = fragCoord/iResolution.xy; 2. Pointing I told you each pixel has a screen coordinate. At each coordinate we need to link with sampler's coordinate. Sampler has also coordinate 0.0 to 1.0. As a result, we see the samplers p...

OpenGL SL - Mosaic effect

Mosaic effect is similar to lowering the resolution of an image. Let's see example image. And full source code likes below. void mainImage( out vec4 fragColor, in vec2 fragCoord ){     // Normalized pixel coordinates (from 0 to 1)     vec2 uv = fragCoord/iResolution.xy;     if (uv.x > 0.7 && uv.y < 0.4 ){          //left bottoom small image         uv.x -= 0.6 ;         uv *= 2.0 ;         fragColor = texture (iChannel0, uv);         fragColor += vec4 ( 0.2 );         return ;     }     //mosaic effect     uv = uv * 30.0 ;     vec2 uv = floor (uv);     uv = uv/ 30.0 ;     fragColor = texture (iChannel0, uv); } The key function of mosaic effect is "floor" If you want to make it sharper, multiply uv by ...

OpenGL SL - Translate, roate, and scale

Translate, rotate and scale are most basic element of image effect. If you didn't understand how make effect at each pixel, please read again before post "Show Video and Image" . 1. Translate Translation means each pixel move parallel on the x, y-axis. In other words, if you want to translate 0.25 on the x-axis, a pixel should point to a distance of -0.25 from the original. Translate ex) void mainImage( out vec4 fragColor, in vec2 fragCoord ){     vec2 uv = fragCoord/iResolution.xy;     if (uv.x < 0.5 ){         // translate to x ( -0.25 )         uv.x += 0.25 ;     } else {         // translate to x ( +0.25 )         uv.x -= 0.25 ;     }     fragColor = texture (iChannel0, uv); } result) 2. Scale Scale also has a  similar concept to parallel translation. If you want to zoom in twice, each pixel s...