【opencv3】 Mat类用法总结

Mat 是opencv中使用非常频繁的类型,这里对其用法做一点总结。

1、初始化

常用的有三种方法,如下:
Mat M=imread("a.jpg");
Mat M(9,9,CV_8UC3,Scalar(0,0,255));
M.create(100,60,CV_8UC(15));

 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
  
第一行用于直接读取一幅图像。
第二行为标准的初始化格式,四个参数分别表示创建矩阵的长,宽,数据类型、通道,BGR的值。
(1)关于数据类型
CV_8U - 8-bit unsigned integers ( 0..255 )
CV_8S - 8-bit signed integers ( -128..127 )
CV_16U - 16-bit unsigned integers ( 0..65535 )
CV_16S - 16-bit signed integers ( -32768..32767 )
CV_32S - 32-bit signed integers ( -2147483648..2147483647 ) 
CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
这里还需要注意一个问题,很多OpenCV的函数支持的数据深度只有8位和32位的,所以要少使用CV_64F
(2)第四个参数一次设置各通道元素的值,一般rgb图像的数据类型都为8UC3,这边也需要注意: mat存储图像的通道顺序为BGR,所以上面代码第二行表示把这个9*9,3 通道图像的R值都设为255,GB都为0.
第三行则是调用了create函数来进行初始化。
还有必要说一下Mat的存储是逐行的存储的,m0.data是指向m0(0,0)的指针。
以下将总结一些常用的Mat类成员函数

2、clone

m1 = m0.clone();  //将m0完全拷贝到m1中,同时拷贝m0中的所有数据,且拷贝的矩阵是连续的。 
所谓完全拷贝,就是不仅拷贝头和指针,还会开辟一块新的内存,将数据也复制过来。相比于下面的拷贝:
Mat A(9,9,CV_8UC3,Scalar(0,0,255));
Mat B(A);
Mat C=A;
这两种方式,只拷贝了头和指针,他们指向同一个数据。也就是说如果A改变了,BC都会跟着改变。

3、convertTo

m0.convertTo(m1, type, scale, offset); //将m0中的元素转换成type类(CV_32F等),作scale尺度的缩放,offset偏移,写入m1中。

4、setTo

m0.setTo(s,mask); //将m0中所有的元素的值设为s;如果使用mask,则只设定mask中的非零元素。

5、reshape

m0.reshape(chan, rows); //改变二维矩阵的的实际形状,不进行数据拷贝;若chan或rows为0,则表示不作改变。

6、isContinue

m0.isContinuous(); //如果m0所有的行在内存空间中打包时都没有间隙,则返回true。

7、type

m0.type(); //返回m0中元素的有效类型标识符(如CV_32FC3)

8、total

m0.total(); //计算所有数组元素的个数,不考虑通道。 

9、channels

m0.channels(); //返回m0中元素的通道数目。

10、size、rows、cols

m0.size(); //以cv::Size对象的形式返回m0的大小。
m0.rows();//返回m0的行数。
m0.cols();//返回m0的列数。

11、push_back

m0.push_back(m1); //对mxn矩阵作k行扩展,并将m1拷贝到这些行中;m1的大小为kxn。 

12、at

at函数用于访问矩阵内某点的值,用法如下:
m0.at<>(i,j)[c];
其中<>内应填入m0元素的数据类型,uchar对应的是CV_8U,char对应的是CV_8S,int对应的是CV_32S,float对应的是CV_32F,double对应的是CV_64F。
若m0是多通道矩阵,则数据类型应为Vec3b,c为当前处理的通道序号。i,j,c都是从零开始的。

参考文献:

http://blog.csdn.net/yang_xian521/article/details/7107786
http://blog.csdn.net/guduruyu/article/details/67631640

你可能感兴趣的:(【opencv3】 Mat类用法总结)