OpenCV Mat
Mat-The Basic image container
OpenCV是一个强大的计算机视觉库,也就意味着要对图像进行操作,图像在计算机中以矩阵的形式表示,所以Mat类(matrix的简称)是用来处理图像的一个封装类
Mat是一个具有两个数据部分的类
矩阵头(包含矩阵的大小,用于存储的方法,存储在哪个地址的信息等等)
指向包含像素值(取决于所选存储方法的任何维度)
在内存管理方面,Mat类会管理内存的分配和释放,同时为了减少处理大型矩阵额外的开销(比如频繁复制),OpenCV使用引用计数系统,每个Mat对象都有自己的头,但是通过使它们的矩阵指针指向相同的地址,矩阵可以在它们的两个实例之间共享
1
2
3
cv::Mat a ; //默认构造函数,创建矩阵头
a = cv::imread("test.jpg"); //读入图像,矩阵指针指向该像素数据
cv::Mat b = a ; //复制
a和b有各自的矩阵头,但是都指向同一个矩阵,改变其中一个就会改变另一个
Mat常用的构造函数
1
cv::Mat::Mat(int row,int col,int type)
创建矩阵时提供矩阵行数(row)列数(col)和存储类型(type 如 CV_8UC3 3通道8位无符号数)
1
cv::Mat::Mat(Size size,int type)
Size类型可以理解为tuple类型,等效于一个成对的数据结构,在Size中row和col是反过来的
1
Mat src(Size(3, 4), CV_32FC3);
src是一个四行三列的32位float矩阵
1
cv::Mat::Mat(const Mat & m)
复制了一个矩阵头
常用的成员函数
at()
访问矩阵元素,根据使用情况有不同的重载函数,比如矩阵只是一个一维的向量时可以A.at<float>(k+4)
使用,若是二维矩阵时
1
2
3
4
Mat H(100, 100, CV_64F);
for(int i = 0; i < H.rows; i++)
for(int j = 0; j < H.cols; j++)
H.at<double>(i,j)=1./(i+j+1);
clone()
1
2
3
Mat image1 = imread("test.png",IMREAD_COLOR);
Mat image2 = image1;
Mat image3 = image1.clone();
image2和image3都是从image1 copy来的,区别在于拷贝策略,image2是浅拷贝image3是深拷贝
convertTo()
转换矩阵的存储类型,具体计算公式如下
1
m(x,y)=saturate_cast<rType>(α(∗this)(x,y)+β)
m是输入矩阵,rtype是目标类型,alpha是放缩系数,beta是增减标量
1
2
Mat image = imread("test.png",IMREAD_COLOR);
image.convertTo(CV_32FC3); //转换成32位float
copyTo()
与clone()作用类似,使用形式不同
1
2
3
4
Mat image1 = imread("test.png",IMREAD_COLOR);
Mat image2 = image1.clone();
Mat image3;
image1.copyTo(image3);
image2和image3都是深拷贝得来的
create()
1
void cv::Mat::create(int rows,int cols,int type)
如果需要,分配新的矩阵
depth()
1
int cv::Mat::depth () const
返回矩阵的存储类型,比如矩阵时16位有符号的,那么返回CV_16S
mul()
1
MatExpr cv::Mat::mul(InputArray m,double scale = 1) const
矩阵乘法
1
Mat AB = A.mul(B)
要求A和B类型相同,AB无类型声明时和A、B保持一致
inv()
1
Matx<_Tp, n, m> cv::Matx< _Tp, m, n >::inv(int method = DECOMP_LU,bool *p_is_ok = NULL)const
矩阵求逆,第一个参数定义了求逆用的方法
total()
1
size_t cv::Mat::total() const
返回矩阵中元素的个数
成员变量
1
2
3
4
5
6
7
8
9
int cv::Mat::cols; //返回矩阵的列数
int cv::Mat::rows // 返回矩阵行数
uchar* cv::Mat::data // 指向矩阵的数据单元的指针
int cv::Mat::dims // 返回矩阵维度,该维度≥2
MatSize cv::Mat::size // 返回矩阵大小