在Opencv1.0中存储图像的变量类型一般为cvMat和IpLImage,现在一般不用了。
在Opencv2.0以后引入了Mat类,其好处是:1.不用手动开辟空间 2.不必在不需要时立即释放,这样使得开发效率大大提高。
Mat类由矩阵头和指向存储所有像素值的矩阵的指针构成。Mat类表示一个n维的密集数值单通道或多通道数组,可用来存储实数和复数的向量和矩阵、图像类等。
下面是Mat类的代码
class CV_EXPORTS Mat
{
public:
//标志位
int flags;
//数组的维数,≥2
int dims;
//行和列的数量或(-1,-1),此时数组已超过2维
int rows,cols;
//指向数据的指针
uchar *data;
//指针的引用计数器,当阵列指向用户分配的数据时,指针为NULL
int *refcount;
};
矩阵头用来刻画矩阵尺寸,存储方法、存储地址及引用次数等信息,矩阵头大小是一个常数,不会随图像的大小变化而变化,但是保存图像像素数据的矩阵则会随图像的大小变化而改变,通常数据量会很大,比矩阵头大几个数量级。这样在图像复制和传递过程中,内存主要的开销是由存放图像像素的矩阵引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针
Mat类常用构造方法如下:
1.Mat Image;//无参数构造方法
e.g: Mat origin_Image;
2.Mat Image(int rows,int cols,int type,const Scalar&s);//创建行数为rows,列数为cols,类型为type,并将所有元素初始化为值s
e.g:Mat Image(6,6,CV_8UC2,Scalar(1,3);//其中8U表示8位无符号整数,C2表示二通道,Scalar表示赋值为(1+3j)
3.Mat Image(Size size,int type,const Scalar&s);//创建大小为size,类型为type的图像,并将所有元素初始化为s
e.g:Mat Image(size(7,7),CV_8UC3,Scalar(1,2,3));
4.Mat(const Mat&m)//将m赋值给新创建的对象
e.g:Mat Image6(Image2);
Mat基本操作
Mat::row; Mat::col
e.g:int rows = Image.row;
Mat::rowRange Mat::colRange//为指定的行(列)span创建一个矩阵头,可取指定行(列)区间元素
Mat::clone;//创建一个数组及其基础数据的完整副本
Mat::copyto;//把矩阵复制到另一个矩阵中
Mat::convertTo;//数据类型转行
Mat::zeros;//返回制定的大小和类型的零数组
Mat::ones;//返回制定的大小和类型全为1的数组
Mat::channels;//返回矩阵通道的数目
Mat::empty;//如果数组有没有 elemens,则返回True
Mat::at;//返回对指定数组元素的引用