OpenCV學(xué)習(xí)筆記(三)重要類型Mat

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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,410評(píng)論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,955評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,266評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,468評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,696評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,193評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,431評(píng)論 2 378

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