Mat类是OpenCV中的一个非常重要的类,Mat类用于表示一个多维的单通道或者多通道的稠密数组。能够用来保存实数或复数的向量、矩阵,灰度或彩色图像,立体元素,点云,张量以及直方图(高维的直方图使用SparseMat保存比较好)。简而言之,Mat就是用来保存多维的矩阵的。
下面来重点介绍一下Mat类:
Mat类的常见属性
- rows 矩阵的行数
- cols 矩阵的列数
- size 矩阵的大小
- dims 矩阵的维度
- channels 矩阵元素的通道数,如过每个像素都由RGB三部分组成,则channels=3
- data uchar(即无符号字符类型unsigned char)指针,指向矩阵数据的指针。
- type 表示矩阵中元素的数据类型及通道数,具有以下的值:
CV_8UC1 CV_8UC2 CV_8UC3 CV_8UC4
CV_8SC1 CV_8SC2 CV_8SC3 CV_8SC4
CV_16UC1 CV_16UC2 CV_16UC3 CV_16UC4
CV_16SC1 CV_16SC2 CV_16SC3 CV_16SC4
CV_32SC1 CV_32SC2 CV_32SC3 CV_32SC4
CV_32FC1 CV_32FC2 CV_32FC3 CV_32FC4
CV_64FC1 CV_64FC2 CV_64FC3 CV_64FC4
这里U表示的是无符号整数(unsigned integer),S是有符号整数(signed integer),F是浮点数(float)。
例如:CV_16UC2,表示的是元素类型是一个16位的无符号整数,通道为2。C1,C2,C3,C4则表示通道数是1,2,3,4。
- depth 表示矩阵中元素的一个通道的数据类型,这个值和type是相关的。例如 type为 CV_16SC2,一个2通道的16位的有符号整数。那么,depth则是CV_16S。depth也是一系列的预定义值,将type的预定义值去掉通道信息就是depth值:CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F
- elemSize 表示矩阵一个元素占用的字节数,例如:type是CV_16SC3(3通道,16位),那么elemSize = 3 * 16 / 8 = 6 字节(每字节8bit)
- elemSize1 表示矩阵元素一个通道占用的字节数,例如:type是CV_16CS3(3通道,16位),那么elemSize1 = 16 / 8 = 2 字节 = elemSize / channels
Mat的矩阵的初始化
Mat矩阵有很多构造函数:
(1) Mat::Mat()
(2) Mat::Mat(int rows, int cols, int type)
(3) Mat::Mat(Size size, int type)
(4) Mat::Mat(int rows, int cols, int type, const Scalar& s)
(5) Mat::Mat(Size size, int type, const Scalar& s)
(6) Mat::Mat(const Mat& m)
(7) Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
(8) Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
(9) Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
(10) Mat::Mat(const Mat& m, const Rect& roi)
(11) Mat::Mat(const CvMat* m, bool copyData=false)
(12) Mat::Mat(const IplImage* img, bool copyData=false)
(13) template explicit Mat::Mat(const Vec& vec, bool copyData=true)
(14) template explicit Mat::Mat(const Matx& vec, bool copyData=true)
(15) template explicit Mat::Mat(const vector& vec, bool copyData=false)
(16) Mat::Mat(const MatExpr& expr)
(17) Mat::Mat(int ndims, const int* sizes, int type)
(18) Mat::Mat(int ndims, const int* sizes, int type, const Scalar &s)
(19) Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)
(20) Mat::Mat(const Mat& m, const Range* ranges)
这些参数顾名思义,就不再过多解释
Mat类中常用的函数
Mat::eye 返回一个恒等指定大小和类型矩阵。
C++: static MatExpr Mat::eye(int rows, int cols, inttype)
C++: static MatExpr Mat::eye(Size size, int type)
参数:
rows –的行数。
cols– 的列数。
size –替代矩阵大小规格Size(cols, rows)的方法。
type – 创建的矩阵的类型。
Mat::create 分配新的阵列数据 (如果需要)。
C++: void Mat::create(int rows, int cols, int type)
C++: void Mat::create(Size size, int type)
C++: void Mat::create(int ndims, const int* sizes, inttype)
参数;
ndims – 新数组的维数。
rows –新的行数。
cols – 新的列数。
size – 替代新矩阵大小规格:Size(cols, rows)。
sizes – 指定一个新的阵列形状的整数数组。
type – 新矩阵的类型。
这是关键的Mat方法之一。大多数新样式 OpenCV 函数和产生阵列的方法每个输出数组都调用这个方法。此方法使用如下算法:
1.如果当前数组形状和类型匹配新的请立即返回。否则,通过调用 Mat::release()取消引用以前的数据。
2.初始化新矩阵头。
3.分配新的 total()*elemSize() 个字节的数据空间。
4.分配新的关联数据的引用计数并将其设置为 1。
Mat::resize 更改矩阵的行数。
C++: void Mat::resize(size_t sz)
C++: void Mat::resize(size_t sz, const Scalar& s)
参数
sz –新的行数。
s –分配给新添加的元素的值。
该方法更改矩阵的行数。如果矩阵重新分配,第一最少(Mat::rows,sz) 行数要保留下来。该方法模拟相应的 STL 向量类的方法。
Mat::reserve 保留一定数量的行的空间。
C++: void Mat::reserve(size_t sz)
参数
sz –的行数。
该方法sz行存储空间。如果矩阵已经有足够的空间来存储sz行,没有任何异常发生。如果矩阵重新分配,保留前(Mat::rows) 行。该方法模拟了相应的STL 向量类的方法。
Mat::push_back 将元素添加到矩阵的底部。
C++: templatevoidMat::push_back(const T& elem)
C++: void Mat::push_back(const Mat& elem)
参数
elem –增加的一个或多个元素。
该方法将一个或多个元素添加到矩阵的底部。他们是模拟相应的 STL 向量类的方法。元素为Mat时,其类型和列的数目必须和矩阵容器是相同的。
Mat::pop_back 从底部的列表中删除元素。
C++: templatevoidMat::pop_back(size_t nelems=1)
参数
nelems –删除的行的数目。如果它大于总的行数,则会引发异常。
该方法从底部的列表中删除一行或多行。
Mat::locateROI 父矩阵内定位矩阵头。
C++: void Mat::locateROI(Size& wholeSize,Point& ofs) const
参数
wholeSize–输出参数,其中包含的整个矩阵包含大小 * 这是其中一部分。
ofs –输出参数包含*this在整个的矩阵里面的偏移量。
你使用Mat::row()、 Mat::col()、 Mat::rowRange()、Mat::colRange()以及其他的方法从矩阵中提取子阵后该结果子阵只指向原始大矩阵的一部分。然而,每个子阵包含有助于重建的最初矩阵大小和提取子阵在原始矩阵中的位置信息(由 datastart 和 dataend fields表示)。locateROI方法正是这样做的。
Mat::adjustROI 调整子阵大小及其在父矩阵中的位置。
C++: Mat& Mat::adjustROI(int dtop, int dbottom,int dleft, int dright)
参数
dtop –顶部子阵边界向上的平移量。
dbottom –底部子阵边界向下的平移量。
dleft –左子阵边界向左的平移量。
dright –右子阵边界向右的平移量。
该方法是 Mat::locateROI() 的互补性方法。这些函数的典型应用是确定父矩阵中子阵的位置,然后以某种方式改变位置。尤其典型的是,当滤镜操作中要考虑ROI外的像素时就需要它。当方法的所有参数都是正的时候,ROI需要以指定量全方位增长。
Mat::operator() 提取矩形子阵。
C++: Mat Mat::operator()(Range rowRange, RangecolRange) const
C++: Mat Mat::operator()(const Rect& roi) const
C++: Mat Mat::operator()(const Ranges* ranges) const
参数:
rowRange –提取的子阵的开始和结束的行。不包括的上限。若要选择的所有行,请使用 Range::all()。
colRange –提取的子阵的开始和结束的列。不包括的上限。若要选择的所有列,请使用 Range::all()。
roi – 抽出子阵 specified 作为一个矩形。
ranges – 选定范围沿每个数组维度的数组。
Mat::operator CvMat 创建矩阵 CvMat 头。
C++: Mat::operator CvMat() const
该运算符创建矩阵 CvMat 的头,而不复制的基础数据。引用计数未被考虑到此操作中。因此,您应该确保CvMat 头在使用的时候不释放原始矩阵。该运算符对于新旧OpenCV API混用是有用的。
Mat::operator IplImage 创建IplImage矩阵头。
C++: Mat::operator IplImage() const运算符创建矩阵 IplImage 头,而不复制的基础数据。您应该确保使用IplImage头时不释放原矩阵。与Mat::operatorCvMat类似,该运算符在OpenCV新旧API混用中很有用。
Mat::total 返回数组元素的总数。
C++: size_t Mat::total() const该方法返回数组元素(如果该数组表示图像的像素数)的数目。
Mat::isContinuous 返回矩阵是否连续。
Mat::empty 如果数组有没有 elemens,则返回 true。
C++: bool Mat::empty() const
如果 Mat::total() 是 0 或 Mat::data 为 NULL,则方法返回 true。因为pop_back() 和 resize()方法M.total()= = 0,并不意味着M.data = =NULL。
Mat::ptr 返回指定矩阵行的指针。
C++: uchar* Mat::ptr(int i=0)
C++: const uchar* Mat::ptr(int i=0) const
C++: template_Tp* Mat::ptr(inti=0)
C++: templateconst _Tp*Mat::ptr(int i=0) const
参数:i –一个基于0的行索引。该方法返回uchar*,或指向由输入指定矩阵行的指针。参看Mat::isContinuous()的中示例了解如何使用这些方法。
Mat::at 返回对指定数组元素的引用。
C++: templateT& Mat::at(int i)const
C++: templateconst T&Mat::at(int i) const
C++: templateT& Mat::at(int i,int j)
C++: templateconst T&Mat::at(int i, int j) const
C++: templateT& Mat::at(Pointpt)
C++: templateconst T&Mat::at(Point pt) const
C++: templateT& Mat::at(int i,int j, int k)
C++: templateconst T&Mat::at(int i, int j, int k) const
C++: templateT& Mat::at(constint* idx)
C++: templateconst T&Mat::at(const int* idx) const
参数
i –索引 0 维度
j – 1 维度的索引
k – 沿 2 维度的索引
pt – Point(j,i) 作为指定元素的位置。
idx – Mat::dims 数组的索引。
Mat::begin 返回矩阵迭代器,并将其设置为第一矩阵元。
C++: templateMatIterator_<_Tp> Mat::begin()
C++: templateMatConstIterator_<_Tp> Mat::begin() const
该方法返回矩阵的只读或读写的迭代器。矩阵迭代器的使用和双向 STL 迭代器的使用是非常相似的。
Mat::end 返回矩阵迭代器,并将其设置为 最后元素之后(after-last)的矩阵元。
C++: templateMatIterator_<_Tp> Mat::end()
C++: templateMatConstIterator_<_Tp> Mat::end() const
该方法返回矩阵只读或读写的迭代器,设置为紧随最后一个矩阵元素的点。