Mat類是OpenCV中的一個(gè)非常重要的類,Mat類用于表示一個(gè)多維的單通道或者多通道的稠密數(shù)組。能夠用來(lái)保存實(shí)數(shù)或復(fù)數(shù)的向量、矩陣,灰度或彩色圖像,立體元素,點(diǎn)云,張量以及直方圖(高維的直方圖使用SparseMat保存比較好)。簡(jiǎn)而言之,Mat就是用來(lái)保存多維的矩陣的。
下面來(lái)重點(diǎn)介紹一下Mat類:
Mat類的常見(jiàn)屬性
- rows 矩陣的行數(shù)
- cols 矩陣的列數(shù)
- size 矩陣的大小
- dims 矩陣的維度
- channels 矩陣元素的通道數(shù),如過(guò)每個(gè)像素都由RGB三部分組成,則channels=3
- data uchar(即無(wú)符號(hào)字符類型unsigned char)指針,指向矩陣數(shù)據(jù)的指針。
- type 表示矩陣中元素的數(shù)據(jù)類型及通道數(shù),具有以下的值:
? ? ? ? ? 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表示的是無(wú)符號(hào)整數(shù)(unsigned integer),S是有符號(hào)整數(shù)(signed integer),F(xiàn)是浮點(diǎn)數(shù)(float)。
例如:CV_16UC2,表示的是元素類型是一個(gè)16位的無(wú)符號(hào)整數(shù),通道為2。C1,C2,C3,C4則表示通道數(shù)是1,2,3,4。
- depth? 表示矩陣中元素的一個(gè)通道的數(shù)據(jù)類型,這個(gè)值和type是相關(guān)的。例如 type為 CV_16SC2,一個(gè)2通道的16位的有符號(hào)整數(shù)。那么,depth則是CV_16S。depth也是一系列的預(yù)定義值,將type的預(yù)定義值去掉通道信息就是depth值:CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F
- elemSize? 表示矩陣一個(gè)元素占用的字節(jié)數(shù),例如:type是CV_16SC3(3通道,16位),那么elemSize = 3 * 16 / 8 = 6 字節(jié)(每字節(jié)8bit)
- elemSize1? 表示矩陣元素一個(gè)通道占用的字節(jié)數(shù),例如:type是CV_16CS3(3通道,16位),那么elemSize1 = 16? / 8 = 2 字節(jié) = elemSize / channels
Mat的矩陣的初始化
Mat矩陣有很多構(gòu)造函數(shù):
(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)
這些參數(shù)顧名思義,就不再過(guò)多解釋
Mat類中常用的函數(shù)
Mat::eye? ??返回一個(gè)恒等指定大小和類型矩陣。
C++: static MatExpr Mat::eye(int rows, int cols, inttype)
C++: static MatExpr Mat::eye(Size size, int type)
參數(shù):
rows –的行數(shù)。
cols– 的列數(shù)。
size –替代矩陣大小規(guī)格Size(cols, rows)的方法。
type – 創(chuàng)建的矩陣的類型。
Mat::create? ??分配新的陣列數(shù)據(jù) (如果需要)。
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)
參數(shù);
ndims – 新數(shù)組的維數(shù)。
rows –新的行數(shù)。
cols – 新的列數(shù)。
size – 替代新矩陣大小規(guī)格:Size(cols, rows)。
sizes – 指定一個(gè)新的陣列形狀的整數(shù)數(shù)組。
type – 新矩陣的類型。
這是關(guān)鍵的Mat方法之一。大多數(shù)新樣式 OpenCV 函數(shù)和產(chǎn)生陣列的方法每個(gè)輸出數(shù)組都調(diào)用這個(gè)方法。此方法使用如下算法:
1.如果當(dāng)前數(shù)組形狀和類型匹配新的請(qǐng)立即返回。否則,通過(guò)調(diào)用 Mat::release()取消引用以前的數(shù)據(jù)。
2.初始化新矩陣頭。
3.分配新的 total()*elemSize() 個(gè)字節(jié)的數(shù)據(jù)空間。
4.分配新的關(guān)聯(lián)數(shù)據(jù)的引用計(jì)數(shù)并將其設(shè)置為 1。
Mat::resize? ??更改矩陣的行數(shù)。
C++: void Mat::resize(size_t sz)
C++: void Mat::resize(size_t sz, const Scalar& s)
參數(shù)
sz –新的行數(shù)。
s –分配給新添加的元素的值。
該方法更改矩陣的行數(shù)。如果矩陣重新分配,第一最少(Mat::rows,sz) 行數(shù)要保留下來(lái)。該方法模擬相應(yīng)的 STL 向量類的方法。
Mat::reserve? ? ?保留一定數(shù)量的行的空間。
C++: void Mat::reserve(size_t sz)
參數(shù)
sz –的行數(shù)。
該方法sz行存儲(chǔ)空間。如果矩陣已經(jīng)有足夠的空間來(lái)存儲(chǔ)sz行,沒(méi)有任何異常發(fā)生。如果矩陣重新分配,保留前(Mat::rows) 行。該方法模擬了相應(yīng)的STL 向量類的方法。
Mat::push_back? ?將元素添加到矩陣的底部。
C++: templatevoidMat::push_back(const T& elem)
C++: void Mat::push_back(const Mat& elem)
參數(shù)
elem –增加的一個(gè)或多個(gè)元素。
該方法將一個(gè)或多個(gè)元素添加到矩陣的底部。他們是模擬相應(yīng)的 STL 向量類的方法。元素為Mat時(shí),其類型和列的數(shù)目必須和矩陣容器是相同的。
Mat::pop_back? ??從底部的列表中刪除元素。
C++: templatevoidMat::pop_back(size_t nelems=1)
參數(shù)
nelems –刪除的行的數(shù)目。如果它大于總的行數(shù),則會(huì)引發(fā)異常。
該方法從底部的列表中刪除一行或多行。
Mat::locateROI? ??父矩陣內(nèi)定位矩陣頭。
C++: void Mat::locateROI(Size& wholeSize,Point& ofs) const
參數(shù)
wholeSize–輸出參數(shù),其中包含的整個(gè)矩陣包含大小 * 這是其中一部分。
ofs –輸出參數(shù)包含*this在整個(gè)的矩陣?yán)锩娴钠屏俊?/p>
你使用Mat::row()、 Mat::col()、 Mat::rowRange()、Mat::colRange()以及其他的方法從矩陣中提取子陣后該結(jié)果子陣只指向原始大矩陣的一部分。然而,每個(gè)子陣包含有助于重建的最初矩陣大小和提取子陣在原始矩陣中的位置信息(由 datastart 和 dataend ?elds表示)。locateROI方法正是這樣做的。
Mat::adjustROI? ??調(diào)整子陣大小及其在父矩陣中的位置。
C++: Mat& Mat::adjustROI(int dtop, int dbottom,int dleft, int dright)
參數(shù)
dtop –頂部子陣邊界向上的平移量。
dbottom –底部子陣邊界向下的平移量。
dleft –左子陣邊界向左的平移量。
dright –右子陣邊界向右的平移量。
該方法是 Mat::locateROI() 的互補(bǔ)性方法。這些函數(shù)的典型應(yīng)用是確定父矩陣中子陣的位置,然后以某種方式改變位置。尤其典型的是,當(dāng)濾鏡操作中要考慮ROI外的像素時(shí)就需要它。當(dāng)方法的所有參數(shù)都是正的時(shí)候,ROI需要以指定量全方位增長(zhǎng)。
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
參數(shù):
rowRange –提取的子陣的開始和結(jié)束的行。不包括的上限。若要選擇的所有行,請(qǐng)使用 Range::all()。
colRange –提取的子陣的開始和結(jié)束的列。不包括的上限。若要選擇的所有列,請(qǐng)使用 Range::all()。
roi – 抽出子陣 speci?ed 作為一個(gè)矩形。
ranges – 選定范圍沿每個(gè)數(shù)組維度的數(shù)組。
Mat::operator CvMat??創(chuàng)建矩陣 CvMat 頭。
C++: Mat::operator CvMat() const
該運(yùn)算符創(chuàng)建矩陣 CvMat 的頭,而不復(fù)制的基礎(chǔ)數(shù)據(jù)。引用計(jì)數(shù)未被考慮到此操作中。因此,您應(yīng)該確保CvMat 頭在使用的時(shí)候不釋放原始矩陣。該運(yùn)算符對(duì)于新舊OpenCV API混用是有用的。
Mat::operator IplImage? ?創(chuàng)建IplImage矩陣頭。
C++: Mat::operator IplImage() const運(yùn)算符創(chuàng)建矩陣 IplImage 頭,而不復(fù)制的基礎(chǔ)數(shù)據(jù)。您應(yīng)該確保使用IplImage頭時(shí)不釋放原矩陣。與Mat::operatorCvMat類似,該運(yùn)算符在OpenCV新舊API混用中很有用。
Mat::total??返回?cái)?shù)組元素的總數(shù)。
C++: size_t Mat::total() const該方法返回?cái)?shù)組元素(如果該數(shù)組表示圖像的像素?cái)?shù))的數(shù)目。
Mat::isContinuous? ?返回矩陣是否連續(xù)。
Mat::empty? ??如果數(shù)組有沒(méi)有 elemens,則返回 true。
C++: bool Mat::empty() const
如果 Mat::total() 是 0 或 Mat::data 為 NULL,則方法返回 true。因?yàn)閜op_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
參數(shù):i –一個(gè)基于0的行索引。該方法返回uchar*,或指向由輸入指定矩陣行的指針。參看Mat::isContinuous()的中示例了解如何使用這些方法。
Mat::at? ? ?返回對(duì)指定數(shù)組元素的引用。
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
參數(shù)
i –索引 0 維度
j – 1 維度的索引
k – 沿 2 維度的索引
pt – Point(j,i) 作為指定元素的位置。
idx – Mat::dims 數(shù)組的索引。
Mat::begin? ??返回矩陣迭代器,并將其設(shè)置為第一矩陣元。
C++: templateMatIterator_<_Tp> Mat::begin()
C++: templateMatConstIterator_<_Tp> Mat::begin() const? ??
該方法返回矩陣的只讀或讀寫的迭代器。矩陣迭代器的使用和雙向 STL 迭代器的使用是非常相似的。
Mat::end? ?返回矩陣迭代器,并將其設(shè)置為 最后元素之后(after-last)的矩陣元。
C++: templateMatIterator_<_Tp> Mat::end()
C++: templateMatConstIterator_<_Tp> Mat::end() const
該方法返回矩陣只讀或讀寫的迭代器,設(shè)置為緊隨最后一個(gè)矩陣元素的點(diǎn)。