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 ?elds表示)。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 – 抽出子陣 speci?ed 作為一個矩形。
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
該方法返回矩陣只讀或讀寫的迭代器,設置為緊隨最后一個矩陣元素的點。