OpenCV 二 Mat簡介(原理)

2021-06-22 10:40:53 字數 2811 閱讀 8722

在對影象進行處理時,首先需要將影象載入到記憶體中,而mat就是影象在記憶體中的容器,管理著影象在記憶體中的資料。

mat是c++ 的乙個類,由於opencv2中引入了記憶體自動管理機制,所以不必手動的為mat開闢記憶體空間以及手動的釋放記憶體。

mat中包含的資料主要由兩個部分構成:

1.矩陣頭(矩陣尺寸、儲存方法、儲存位址等資訊)(大小固定)

2.乙個指向儲存影象所有畫素值的矩陣(根據所選的儲存方法不同的矩陣可以是不同的維數)的指標

在影象處理中,對影象的處理不可能是在乙個函式中完成的,這就需要在不同的函式間傳遞mat

同時,影象處理的計算量是很大,除非萬不得已就不要去傳遞比較大的mat。這就要求使用某種機制來實現mat的快速傳遞

mat中主要有矩陣頭和乙個指向矩陣的指標,矩陣頭是乙個常數值,但是矩陣儲存了影象所有的畫素值,通常會比矩陣頭大幾個數量級,因此傳遞mat是主要的消耗是在矩陣複製上。

為了解決這個問題,opencv中引入了計數機制。

每個mat都有自己的資訊頭,但是共享同乙個矩陣,也就是在傳遞mat時,只複製矩陣頭和指向矩陣的指標。

3:      mat b(a) ; //拷貝建構函式

4:      a = c ; //複製運算子

上面**中3個mat物件a,b,c指向同乙個矩陣,由於都指向了同乙個矩陣

某乙個物件對矩陣進行操作時也會

影響到其他物件讀取到的矩陣

多個物件同時使用乙個矩陣,那麼當不需要該矩陣時,

誰來負責清理

?   

簡單的回答是,

最後乙個使用它的物件

通過引用計數機制,無論什麼時候mat物件的資訊頭被複製了,都會增加矩陣的引用次數加1;

反之,當乙個mat的資訊頭被釋放後,引用計數就會被減1;當計數被減到0時,矩陣就會被釋放。

有些時候還是需要拷貝矩陣本身的,這時候可以使用clonecopyto

通過clone和copyto建立的mat,都有自己的矩陣,修改其中乙個的矩陣不會對其他的造成影響。

mat_對應的是cv_8u,

mat_對應的是cv_8s,

mat_對應的是cv_32s,

mat_對應的是cv_32u,

mat_對應的是cv_32f,

mat_對應的是cv_64f

這裡還需要注意乙個問題,很多opencv的函式支援的資料深度只有8位和32位的,

所以要少使用cv_64f,但是vs的編譯器又會把float資料自動變成double型,有些不太爽。

還有個需要注意的問題,就是流操作符《對於mat的操作,僅限於mat是2維的情況。

mat的儲存是逐行的儲存的。

方式有兩種:

1.mat(行,列,型別(值))

2.呼叫create(行,列,型別)

// make a 7x7 complex matrix filled with 1+3j.

1.mat m(7,7,cv_32fc2,scalar(1,3));

// and now turn m to a 100x60 15-channel 8-bit matrix.

2. m.create(100,60,cv_8uc(15));  // c代表channel通道數

要是想建立更高維的矩陣,要寫成下面的方式:

int sz = ; 

mat bigcube(3, sz, cv_8u, scalar::all(0));  

OpenCV翻譯專案總結二 Mat翻譯

今天翻譯完了opencv mat。本篇教程主要介紹了mat作為opencv影象處理的基本容器的使用 基本概念 輸入輸出 如何定義 執行方式進行了基本介紹。在翻譯這篇教程的時候,我又一次請到了編輯進行審核。結果還是一樣,有嚴重的翻譯腔。雖然在此之前,我的翻譯稿件是一次通過的,但是這次的翻譯還是讓我感受...

opencv建立Mat物件

在opencv中引入了mat類。mat類是乙個非常優秀的影象類,它同時也是乙個通用的矩陣類,可以用來建立和操作多維矩陣。mat類裡面定義了許多建構函式,可以很方便地根據要求建立mat物件。常使用的建構函式有 1 mat mat 無引數建構函式 2 mat mat int rows,int cols,...

第二章 Opencv核心類Mat

opecv就是做計算機視覺,就是講轉換成計算機所能識別的資料 mat類中由大量的內聯函式,主要就是用於提高速度。一般型別都用rgb,存的時候用cv 8uc3.create函式一般會把原來的空間釋放。釋放由opencv自動管理。但有時需要手動釋放。有時計算機會按照四位元組對齊,所以step 0 表示二...