基于windows10、vs2015、OpenCv4.1.0。
目录
1、Mat类简介
OpenCv提供了Mat类用来存储矩阵类型数据,包括向量、矩阵、图像等数据。Mat类分为分为矩阵头和指向存储数据的矩阵指针两部分。矩阵头包含矩阵的尺寸、存储方法、地址和引用次数。矩阵头是一个常数,绝大数情况下,矩阵头的大小远小于矩阵数据量的大小。
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat a;
a = imread("D:\\lena.jpg"); //向a中赋值图像数据
Mat b = a;//只是复制了矩阵头和指向存储数据的指针(指向的是同一个矩阵数据)
waitKey();
return 0;
}
声明一个指定类型的Mat类:
Mat b = Mat_<double>(3, 3);//创建一个3*3的矩阵存放double类型数据
通过OpenCv数据类型创建Mat类
Mat a(640, 480, CV_8UC3)//创建一个640*480的3通道矩阵用于存放彩色图像
Mat a(3, 3, CV_8UC1);//创建一个3*3的8位无符号整数的单通道矩阵
Mat a(3, 3, CV_8U);//创建单通道矩阵,C1标识可以省略
2、Mat类的构造与赋值
2.1、Mat类的构造
默认构造函数
cv::Mat::Mat();
这种构造方式,不需要传递任何参数,在后续给变量赋值的时候会自动判断矩阵的类型与大小,实现灵活的存储,常用于存储读取的图像数据和某个函数运算的输出结果。
根据输入矩阵尺寸和类型构造
cv::Mat::Mat(int rows,int cols,int type)
其中rows:构造矩阵的行数;cols:矩阵的列数;type:矩阵存储的数据类型,例如CV_8UC1之类。
用Size()结构构造Mat类。
cv::Mat::Mat(Size size(), int type);
其中size:为二位数组变量尺寸,通过Size(cols,rows)进行赋值(列在前,行在后);type:矩阵存储的数据类型,例如CV_8UC1之类。
示例:
cv::Mat a(Size(480,580), CV_8UC1);//构造一个行580,列480的单通道矩阵
利用已有矩阵构造Mat类
cv::Mat::Mat(const Mat & a);
这种构造方式只是复制了Mat类的矩阵头,矩阵指针指向是同一个地址。(浅复制)
若要深复制,可用
b = a.clone();
构造已有Mat的子类
cv::Mat::Mat(const Mat & a,const Range & rowRange, const Range & colRange=Range::all);
其中,m:已经构建完成的Mat;rowRange:在已有的矩阵中需要获取的行数范围,是一个Range变量,例如从第二行到第五行表示为Range(2,5);colRange也是一样,在已有的矩阵中需要获取的列数范围,是一个Range变量,例如从第二列到第五列表示为Range(2,5)省略时,所有的列都会被截取。(注意:这种方式构造的类与已有Mat类共享数据。)
例如:
cv::Mat b(a, Range(2, 5), Range(1, 4));//从a中截取第二