以下总结是基于《Opencv3编程入门》一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包。
1. 方法壹---Mat()构造函数
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
这是最常用的方法,以上示例构造了一个二位多通道图像。
2. 方法贰---在C\C++中通过构造函数进行初始化
int sz[3] = {2,2,2};
Mat L(3,sz,CV_8UC3,Scalar::all(0));
这个方法笔者在VS2013 C++编译环境中验证没有通过。
3. 方法叁---为已存在的IplImage指针创建信息头
IplImage* img = cvLoadImage("1.jpg",1);
Mat mtx(img);
这个方法笔者在VS2013 C++编译环境中验证没有通过,至于IplImage指针如何转换成Mat还有待探索。
4. 方法肆---使用create()函数
Mat mat();
mat.create(4,4,CV_8UC(2));
这个方法验证可以正常编译,但输出结果与书中所对应结果不同。
5. 方法伍---采用Matlab方式的初始化
a. Mat E = Mat::eye(4,4,CV_64F);
创建了一个4*4的单位矩阵
b. Mat O = Mat::ones(2,2,CV_32F);
创建了一个2*2的全1矩阵
c. Mat Z = Mat::zeros(3,3,CV_8UC1);
创建了一个3*3的全0矩阵
小结:以上验证均可通过。
6. 方法陆---对小矩阵使用逗号分割式初始化函数
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
经验证可以正常使用。
7. 方法柒---为已存在的对象创建信息头
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
Mat RowClone = C.row(1).clone();
RowClone对C矩阵中的第二行进行了克隆,注意row()中的参数是从0开始。
注意:
a. 以上程序均在书中有详细注解;
b. 在控制台输出矩阵统一都可以使用 cout << "C=" <<endl << " " << C << endl << endl;