基本类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");
}