//11.有关Mat类的一个小程序
#include <opencv2/opencv.hpp>
using namespacecv;
int main(){
Mat A,C;
A=imread("/Users/oumoemoe/Downloads/girl.png",CV_LOAD_IMAGE_COLOR);
Mat B(A);
C=A;
imshow("A", A);
imshow("B", B);
imshow("C", C);//A,B,C指向的是同一个数据矩阵,定义的方式不同。
Mat D(A,Rect(10,10,200,200));//像截图功能一样,使用矩形来界定一个感兴趣的区域ROI.
Mat E=A(Range(100,200),Range(100,300));//和D的功能一样,挑一个感兴趣区域ROI.
imshow("D", D);
imshow("E", E);
Mat F=A.clone();//复制一副图像的矩阵。
Mat G;
A.copyTo(G);//复制一副图像的矩阵。
imshow("F", F);
imshow("G", G);
waitKey(0);
return0;
}
//12.用Mat类构造矩阵,Mat类不仅是图像容器类,而且还是矩阵类,可以通过它来创建和操作矩阵。本例子中主要就是来创建矩阵。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespacecv;
using namespacestd;
int main(){
Mat M(2,2,CV_8UC3,Scalar(0,0,255));//第一个参数为行数,第二个参数为列数,第三个参数为类型,第四个参数可理解为矩阵里填充的数字。CV_【位数】【带符号与否】【类型】【通道数】,这个通道数对应的就是scalar里面数字的个数。严格意义上说Scalar(a,b,c,d)应该有四个元素,如果只用到三个参数,比如RGB那么这时候就可以只写三个参数,a,b,c分别对应RGB的三个值,顺序为蓝/绿/红。这个类被用来大量传递像素值。
cout<<"M"<<endl<<M<<endl;
/* int sz[3]={2,2,2};
Mat L(3,sz,CV_8UC,Scalar::all(0));//这种方法总提示错误,可能某个参数写错了。
cout<<"L"<<endl<<L<<endl;*/
M.create(4,4,CV_8UC(2));//2应该表示的就是通道数,也就是每组有几个元素,这个情况就是一行有八个元素,但是两个元素为一组,所以它是4列
cout<<"M"<<endl<<M<<endl;//这种方法不能为矩阵设初值。每次的数值都会变化,是随机的吗?
Mat E=Mat::eye(4,4,CV_64F);
cout<<"E"<<endl<<E<<endl;
Mat F=Mat::ones(4,4,CV_64F);
cout<<"F"<<endl<<F<<endl;
Mat G=Mat::zeros(4,4,CV_64F);
cout<<"G"<<endl<<G<<endl;
//这三种方法我选择了同样的数据类型,同样的矩阵大小,目的就是对比一下区别。效果很明显,如下:
E
[1, 0, 0, 0;
0, 1, 0, 0;
0, 0, 1, 0;
0, 0, 0, 1]
F
[1, 1, 1, 1;
1, 1, 1, 1;
1, 1, 1, 1;
1, 1, 1, 1]
G
[0, 0, 0, 0;
0, 0, 0, 0;
0, 0, 0, 0;
0, 0, 0, 0]
Mat C=(Mat_<double>(3,3)<<0,1,2,3,4,5,6,7,8);
cout<<"C"<<endl<<C<<endl;
Mat D=C.col(0).clone();//把矩阵C中的第一列copy过来
cout<<"D"<<endl<<D<<endl;
D=C.row(1).clone();//把矩阵C中的第二行copy过来
cout<<"D"<<endl<<D<<endl;
return0;
}