基本类Mat包含两部分数据:矩阵头和指向矩阵的指针。矩阵头包含矩阵的大小、存储方法以及矩阵存储的地址。矩阵包含像素值,取决于存储方式。矩阵头的大小是一个常量,矩阵的大小取决于存储的图片。
每个Mat对象都有自己的矩阵头,矩阵则在不同对象之间共享,只要矩阵指针指向相同的地址就可以。
1、拷贝矩阵头和矩阵指针
// 创建矩阵头:(没有构造函数分配内存,并无实际数据) Mat A,C; // 分配内存 A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 只是复制矩阵头和矩阵指针,数据本身不会复制 C=A; // 创建矩阵头仅仅指向整块数据的一个子区域(ROI) Mat D(A, Rect(10,10,100,100)); // 使用矩形区域创建 Mat E = A(Range::all(),Range(1,3)); // 使用行和列来创建
一块矩阵属于多个Mat对象,最后使用这块数据的Mat对象清除 。
2、拷贝矩阵
Mat F = A.clone(); Mat G = A.copyTo(G)
3、创建和初始化Mat
#include<cv.h> #include<highgui.h> using namespace cv; using namespace std; int main(){ /* 使用Mat构造函数创建 */ Mat M(2,2,CV_8UC3,Scalar(0,0,255)); /* 使用数组创建 */ int size[3] = {2,2,2}; Mat N(3,sz,CV_8UC3,Scalar::all(0)); /* 使用IplImage创建 */ IplImage* img = cvLoadImage("F:/image.jpg",1); Mat P(img); /* 使用Create()创建 */ M.create(4,4,CV_8UC(2)); cout << "Mat = " << endl << M << endl; /* 创建固定格式的Mat */ Mat O = Mat::zeros(3,3,CV_8UC1); Mat E = Mat::ones(2,2,CV_32F); Mat F = Mat::eye(4,4,CV_64F); /* 创建简单的Mat */ Mat C = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0); Mat RowClone = C.row(1).clone(); Mat R = Mat(3,2,CV_8UC3); randu(R,Scalar::all(0),Scalar::all(255)); system("pause"); }