opencv的Mat类(随复习进度更新
Mat类的作用
能够创建或指向一个数据矩阵(存储图片),且可以调整的指向部分数据矩阵的类。
创建方式
图片在opencv的一些基本存储方式:
1.像素点,一张照片是由X行Y列的像素点组成的,而记录这些像素点的数据空间,便是矩阵。
2.BGR三色(蓝绿红,三通道),一般图片的每个像素点(存储三个值)皆是由这三种颜色的明暗程度(0-255)构成的。
3.灰度图片(黑白照片,单通道),早期的黑白电视肯定只有一种色彩表达方式就是黑白的明暗相当于单通道,每个像素点只有一个值(0-255)代表该像素点的明亮程度。
Mat类的几种基本创建方式:
方法一:以读取图片赋值的方式创建
//对象A记录了照片1的大小,存储方法和在项目运行内存中的存储位置。
Mat A = imread("1.png");
方法二:以Mat自身的构造函数创建:
原函数 Mat(int rows, int cols, int type, const Scalar& s);
//4行4列的3通道,纯黑图片(0,0,0)
Mat A(4,4,CV_8UC3,Scalar::all(0));
rows代表行数;cols代表列数;
type:CV_(单个像素的单个通道存储位数)(通道数值存储的类型)C(通道数)
方法三:为已存在的Ipllmage创建信息头,基本淘汰不进行讨论。
方法四:Create()函数
//3行4列的通道数为三的图片,内存已经生成。
Mat M;
M.create(3,4,CV_8UC(3));
生成内容
方法五:Matlab式初始化
Matlab的矩阵与opencv存储图片很类似,因此opencv有Matlab初始化矩阵的几种简单方法:zeros(),ones(),eye()。
前两个可以直接猜测出来是建立全零(zero)矩阵,后者建立全壹(one)矩阵。最后一个(eye)是建立“单位矩阵”,也就是对角线为壹,其他为零。
它们共同的特点是对于多通道只对第一通道处理,其他通道默认为零。
//3行4列的通道数为2的图片,内存已经生成。
Mat::eye(3,4,CV_8UC2);
方法六:针对小矩阵的初始化,采用逗号分隔
Mat a = (Mat_<double>(2, 3) << 0.2, 1, 2, 3, 4, 5);
Mat m = (Mat_<数据类型>(rows,cols)<<*);
方法七:对已经存在对象创建新的信息头
这个信息头其实说法错误,其实是开辟了是的内存空间。用已经存在的Mat类对象来初始化一个新的Mat类对象。
Mat a = (Mat_<uchar>(2, 3) << 1, 1, 1, 2, 2, 2);
Mat b = a.row(0).clone();
cout << "修改前" << endl;
cout << "a为:\n" << a << endl;
cout << "b为:\n" << b << endl;
a.at<uchar>(0, 2) = 7;
cout << "修改后" << endl;
cout << "a为:\n" << a << endl;
cout << "b为:\n" << b << endl;
可以看出当对象a改变时对象b中的值没有改变。