Mat類是OpenCV中的一個非常重要的類伍派,Mat類用于表示一個多維的單通道或者多通道的稠密數(shù)組歼郭。能夠用來保存實數(shù)或復數(shù)的向量抽莱、矩陣溉委,灰度或彩色圖像嫉入,立體元素浪讳,點云虹曙,張量以及直方圖(高維的直方圖使用SparseMat保存比較好)氓癌。簡而言之滑凉,Mat就是用來保存多維的矩陣的统扳。
下面來重點介紹一下Mat類:
Mat類的常見屬性
- rows 矩陣的行數(shù)
- cols 矩陣的列數(shù)
- size 矩陣的大小
- dims 矩陣的維度
- channels 矩陣元素的通道數(shù),如過每個像素都由RGB三部分組成畅姊,則channels=3
- data uchar(即無符號字符類型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表示的是無符號整數(shù)(unsigned integer)朱嘴,S是有符號整數(shù)(signed integer),F(xiàn)是浮點數(shù)(float)陨瘩。
例如:CV_16UC2腕够,表示的是元素類型是一個16位的無符號整數(shù)级乍,通道為2。C1帚湘,C2玫荣,C3,C4則表示通道數(shù)是1,2,3,4大诸。
- depth? 表示矩陣中元素的一個通道的數(shù)據(jù)類型捅厂,這個值和type是相關的。例如 type為 CV_16SC2资柔,一個2通道的16位的有符號整數(shù)焙贷。那么,depth則是CV_16S贿堰。depth也是一系列的預定義值辙芍,將type的預定義值去掉通道信息就是depth值:CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F
- elemSize? 表示矩陣一個元素占用的字節(jié)數(shù),例如:type是CV_16SC3(3通道羹与,16位)故硅,那么elemSize = 3 * 16 / 8 = 6 字節(jié)(每字節(jié)8bit)
- elemSize1? 表示矩陣元素一個通道占用的字節(jié)數(shù),例如:type是CV_16CS3(3通道纵搁,16位)吃衅,那么elemSize1 = 16? / 8 = 2 字節(jié) = elemSize / channels
Mat的矩陣的初始化
Mat矩陣有很多構造函數(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ù)顧名思義,就不再過多解釋
Mat類中常用的函數(shù)
Mat::eye? ??返回一個恒等指定大小和類型矩陣腾誉。
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 – 指定一個新的陣列形狀的整數(shù)數(shù)組干花。
type – 新矩陣的類型。
這是關鍵的Mat方法之一楞黄。大多數(shù)新樣式 OpenCV 函數(shù)和產(chǎn)生陣列的方法每個輸出數(shù)組都調(diào)用這個方法池凄。此方法使用如下算法:
1.如果當前數(shù)組形狀和類型匹配新的請立即返回。否則鬼廓,通過調(diào)用 Mat::release()取消引用以前的數(shù)據(jù)肿仑。
2.初始化新矩陣頭。
3.分配新的 total()*elemSize() 個字節(jié)的數(shù)據(jù)空間。
4.分配新的關聯(lián)數(shù)據(jù)的引用計數(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ù)要保留下來党巾。該方法模擬相應的 STL 向量類的方法。
Mat::reserve? ? ?保留一定數(shù)量的行的空間霜医。
C++: void Mat::reserve(size_t sz)
參數(shù)
sz –的行數(shù)齿拂。
該方法sz行存儲空間。如果矩陣已經(jīng)有足夠的空間來存儲sz行肴敛,沒有任何異常發(fā)生署海。如果矩陣重新分配,保留前(Mat::rows) 行医男。該方法模擬了相應的STL 向量類的方法叹侄。
Mat::push_back? ?將元素添加到矩陣的底部。
C++: templatevoidMat::push_back(const T& elem)
C++: void Mat::push_back(const Mat& elem)
參數(shù)
elem –增加的一個或多個元素昨登。
該方法將一個或多個元素添加到矩陣的底部。他們是模擬相應的 STL 向量類的方法贯底。元素為Mat時丰辣,其類型和列的數(shù)目必須和矩陣容器是相同的。
Mat::pop_back? ??從底部的列表中刪除元素禽捆。
C++: templatevoidMat::pop_back(size_t nelems=1)
參數(shù)
nelems –刪除的行的數(shù)目笙什。如果它大于總的行數(shù),則會引發(fā)異常胚想。
該方法從底部的列表中刪除一行或多行琐凭。
Mat::locateROI? ??父矩陣內(nèi)定位矩陣頭。
C++: void Mat::locateROI(Size& wholeSize,Point& ofs) const
參數(shù)
wholeSize–輸出參數(shù)浊服,其中包含的整個矩陣包含大小 * 這是其中一部分统屈。
ofs –輸出參數(shù)包含*this在整個的矩陣里面的偏移量。
你使用Mat::row()牙躺、 Mat::col()愁憔、 Mat::rowRange()、Mat::colRange()以及其他的方法從矩陣中提取子陣后該結(jié)果子陣只指向原始大矩陣的一部分孽拷。然而吨掌,每個子陣包含有助于重建的最初矩陣大小和提取子陣在原始矩陣中的位置信息(由 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() 的互補性方法。這些函數(shù)的典型應用是確定父矩陣中子陣的位置学辱,然后以某種方式改變位置乘瓤。尤其典型的是,當濾鏡操作中要考慮ROI外的像素時就需要它策泣。當方法的所有參數(shù)都是正的時候衙傀,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
參數(shù):
rowRange –提取的子陣的開始和結(jié)束的行统抬。不包括的上限。若要選擇的所有行危队,請使用 Range::all()聪建。
colRange –提取的子陣的開始和結(jié)束的列。不包括的上限茫陆。若要選擇的所有列金麸,請使用 Range::all()。
roi – 抽出子陣 speci?ed 作為一個矩形簿盅。
ranges – 選定范圍沿每個數(shù)組維度的數(shù)組挥下。
Mat::operator CvMat??創(chuàng)建矩陣 CvMat 頭。
C++: Mat::operator CvMat() const
該運算符創(chuàng)建矩陣 CvMat 的頭桨醋,而不復制的基礎數(shù)據(jù)棚瘟。引用計數(shù)未被考慮到此操作中。因此喜最,您應該確保CvMat 頭在使用的時候不釋放原始矩陣偎蘸。該運算符對于新舊OpenCV API混用是有用的。
Mat::operator IplImage? ?創(chuàng)建IplImage矩陣頭瞬内。
C++: Mat::operator IplImage() const運算符創(chuàng)建矩陣 IplImage 頭迷雪,而不復制的基礎數(shù)據(jù)。您應該確保使用IplImage頭時不釋放原矩陣虫蝶。與Mat::operatorCvMat類似振乏,該運算符在OpenCV新舊API混用中很有用。
Mat::total??返回數(shù)組元素的總數(shù)秉扑。
C++: size_t Mat::total() const該方法返回數(shù)組元素(如果該數(shù)組表示圖像的像素數(shù))的數(shù)目慧邮。
Mat::isContinuous? ?返回矩陣是否連續(xù)调限。
Mat::empty? ??如果數(shù)組有沒有 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
參數(shù):i –一個基于0的行索引倡缠。該方法返回uchar*哨免,或指向由輸入指定矩陣行的指針。參看Mat::isContinuous()的中示例了解如何使用這些方法昙沦。
Mat::at? ? ?返回對指定數(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? ??返回矩陣迭代器采桃,并將其設置為第一矩陣元。
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
該方法返回矩陣只讀或讀寫的迭代器衔蹲,設置為緊隨最后一個矩陣元素的點。