Mat在OpenCV是非常重要的对象,存储图像数据。本例说明Mat的主要使用方法。
1、创建Mat对象
(1)Mat m1,m3;
仅创建了头部信息,所有的值都是0或空值
m1= imread(img_file_name);
(2)Mat m2(m1);
拷贝构造。 以m2的数据初始化m3,两者的数据指针指向同一个内存块。因此,一方修改了图像数据,另一个对象中的数据也会随之改变。
使用引用计数的机制,复制Mat对象的头,矩阵的计数器被增加。每当一个头被清除,此计数器被下调。当该计数器变为零,矩阵也就被释放了。
如下图,两个对象的数据指针data是相同的,说明指向同一个内存。
2、克隆clone对象Mat
克隆出来的对象与原有对象是独立的,数据缓冲指针不同。其它的描述信息(如高宽信息,颜色,通道数)完全相同。
Mat clone1;
clone1 = m1.clone();
3、copy对象Mat
与clone方法类似。copy的结果对象与源对象数据区是独立的。其它信息相同。
4、其它常用的方法
(1) Mat::Create(size, type)函数
创建一个指定信息Mat对象.
(2) Mat::total() 取总像素个数
(3) Mat.depth() 取图像深度
(4) Mat.rows (属性)取图像高度
(5)Mat::cols (属性)取图像宽度
(6) Mat::channles()取图像通道数
(7) Mat::size() 取图像大小
(8) Mat::type() 取图像类型
(9) Mat::empty() 图像判空
(10) Mat::ptr 取行的指针
int row = 10;
uchar* data = m1.ptr<uchar>(row);
(11) Mat::resize 修改图像高度
Mat r;
r= imread(img_file_name);
r.resize(r.rows / 2);
(12) Mat::operator()生成子矩阵
Mat childMat = m1(Rect(m1.cols/4, m1.rows/4, m1.cols *0.7, m1.rows / 2));
5、工程项目源代码下载
本例在Debug – x64下编译通过。
ZIP包中包含开发环境,可直接编译运行。