1. Mat类简介
到 OpenCV2.X版本, OpenCV 开源库引入了面向对象编程思想,大量源代码用C++ 重写,Mat类(Matrix 缩写)是OpenCV 用于处理图像而引入的一个封装类。从功能上讲,Mat类在 IpIIamge 结构的基础上进一步增强,并且,由于引入C++ 高级编程特性,Mat类的扩展性大大提高,Mat 类的内容在后期的版本中不断丰富。查看Mat类的定义(OpenCV3.1\sources\modules\core\include\opencv2\core\mat.hpp
),会发现其设计实现十分全面而具体,基本覆盖计算机视觉对于图像处理的基本要求。
因此,在当前的 OpenCV 开发中,Mat 可以说是最常见的数据单元,深入了解Mat 类对于 OpenCV 深入开发有着重大意义。
2. Mat 类常用成员函数和成员变量
Mat 类十分庞大,其涉及的成员函数和变量难以一一细数。在这里,仅学习记录其最常见的部分,以便日常使用。
2.1 构造函数
2.1.1 默认构造函数
cv::Mat::Mat()
默认构造函数,生成一个矩阵并由 OpenCV 提供的函数(一般是 Mat::create() 和 cv::imread() )来分配储存空间。Mat类可以分为两个部分: 矩阵头和指向像素数据的矩阵指针。
矩阵头 包括数字图像的矩阵尺寸、存储方法、存储地址和引用次数等。矩阵头的大小是一个常数,不会随着像素的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV 使用了引用次数,当进行图像复制和传递时,不再复制整个Mat 数据,而只是复制矩阵头和指向像素矩阵的指针。例如:
cv::Mat a; //默认构造函数,创建矩阵头
a = cv::imread("test.j