一、Mat的存储
1、Mat基本上是一个包含两个数据部分的类:矩阵头(包含矩阵大小,用于存储的方法,存储矩阵的地址等信息)和指向包含矩阵的矩阵的指针。
2、浅拷贝:赋值“=”和copy(),只复制矩阵头和指针,A C有各自的矩阵头,但指针指向同一矩阵,可以改变像素数据。
Mat A,C;
A = imread(argv [1],IMREAD_COLOR);
C=A;//浅拷贝
深拷贝: clone和copyTo()。建立互不影响的Mat,是真正的复制操作,
Mat F,A;
A=imread(argv [1],IMREAD_COLOR);
Mat F = A.clone();
Mat G;
A.copyTo(G);
3、存储深度
Mat_<uchar>对应的是CV_8U,Mat_<char>对应的是CV_8S,
Mat_<int>对应的是CV_32S,Mat_<float>对应的是CV_32F,
Mat_<double>对应的是CV_64F
二、 创建Mat对象
1、使用Mat构造函数:
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
行、列都是2;CV_8UC3:8位无符号整数, 3 channel通道。
2、利用create函数
Mat test;
test.create(4,4,CV_8UC2);
3、采用Matlab形式的初始化方式
(1)Mat me = Mat::eye(4,4,CV_64F);
(2)Mat mo = Mat::ones(2,2,CV_32F);
(3)Mat mz = Mat::zeros(3,3,CV_8UC1);
4、使用逗号分隔的初始值设定项或初始化列表
Mat C =(Mat_ <double>(3,3)<< 0,-1,0,-1,5,-1,0,-1,0);
//列表初始化
double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
Mat M = Mat(3, 3, CV_64F, m).inv();
5、为现有的Mat对象和cv :: Mat :: clone或cv :: Mat :: copyTo创建一个新的头。
Mat RowClone = C.row(1).clone();
6、 使用cv :: randu()函数填充具有随机值的矩阵。
Mat R = Mat(3,2,CV_8UC3);
randu(R,Scalar :: all(0),Scalar :: all(255));
7、要是想创建更高维的矩阵,要写成下面的方式
// create a 100x100x100 8-bit array
int sz[] = {100, 100, 100};
Mat L(3, sz, CV_8U, Scalar::all(0));
实际例子
1、
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
int main()
{
//at获取数据的用法
Mat I = Mat::eye(4, 4, CV_64F);//CV_64F实际为CV_64FC1,单通道
I.at<double>(1, 1) = CV_PI;
cout << "\nI = " << I << ";\n" << endl;
//输出格式
Mat r = Mat(10, 3, CV_8UC3);
randu(r, Scalar::all(0), Scalar::all(255));
cout << "r (OpenCV默认风格) = " << r << ";" << endl << endl;
cout << "r (Python风格) = " << format(r, Formatter::FMT_PYTHON) << ";" << endl << endl;
cout << "r (Numpy风格) = " << format(r, Formatter::FMT_NUMPY) << ";" << endl << endl;
cout << "r (逗号分隔风格) = " << format(r, Formatter::FMT_CSV) << ";" << endl << endl;
cout << "r (C语言风格) = " << format(r, Formatter::FMT_C) << ";" << endl << endl;
//定义二维点、三维点
Point2f p(6, 2);
cout << " 【2维点】p = " << p << ";" << endl;
Point3f p3f(8, 2, 0);
cout << " 【3维点】p3f = " << p3f << ";" << endl;
//vector输出展示为Mat(v)
vector<float> v;
v.push_back(3); v.push_back(5); v.push_back(7);
cout << "【基于Mat的vector】shortvec = " << Mat(v) << ";" << endl;
//存放点的vector
vector<Point2f> points(20);
for (size_t i = 0; i < points.size(); i++)
points[i] = Point2f((float)(i * 5), (float)(i % 7));
cout << "【二维点向量】points = " << points << ";";
waitKey(0);
return 0;
}