OpenCV學習筆記(三)重要類型Mat

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

該方法返回矩陣只讀或讀寫的迭代器衔蹲,設置為緊隨最后一個矩陣元素的點。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呈础,一起剝皮案震驚了整個濱河市踪危,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猪落,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畴博,死亡現(xiàn)場離奇詭異笨忌,居然都是意外死亡,警方通過查閱死者的電腦和手機俱病,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門官疲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亮隙,你說我怎么就攤上這事途凫。” “怎么了溢吻?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵维费,是天一觀的道長果元。 經(jīng)常有香客問我,道長犀盟,這世上最難降的妖魔是什么而晒? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮阅畴,結(jié)果婚禮上倡怎,老公的妹妹穿的比我還像新娘。我一直安慰自己贱枣,他們只是感情好监署,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纽哥,像睡著了一般钠乏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昵仅,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天缓熟,我揣著相機與錄音,去河邊找鬼摔笤。 笑死够滑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吕世。 我是一名探鬼主播彰触,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼命辖!你這毒婦竟也來了况毅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤尔艇,失蹤者是張志新(化名)和其女友劉穎尔许,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體终娃,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡味廊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棠耕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片余佛。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窍荧,靈堂內(nèi)的尸體忽然破棺而出辉巡,到底是詐尸還是另有隱情,我是刑警寧澤蕊退,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布郊楣,位于F島的核電站憔恳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痢甘。R本人自食惡果不足惜喇嘱,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塞栅。 院中可真熱鬧者铜,春花似錦、人聲如沸放椰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砾医。三九已至拿撩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間如蚜,已是汗流浹背压恒。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留错邦,地道東北人探赫。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像撬呢,于是被迫代替她去往敵國和親伦吠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容