Posts OpenCV Mat
Post
Cancel

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 // 返回矩阵大小
OLDER POST NEWER POST

Comments powered by Disqus.

Search Results