天天看點

Mat 類的記憶體管理

使用 Mat 類,記憶體管理變得簡單,不再像使用 IplImage 那樣需要自己申請和釋放記憶體。雖然不了解 Mat 的記憶體管理機制,也無礙于 Mat 類的使用,但是如果清楚了解 Mat 的記憶體管理,會更清楚一些函數到底操作了哪些資料。

Mat 是一個類,由兩個資料部分組成:矩陣頭(包含矩陣尺寸,存儲方法,存儲位址等資訊)和一個指向存儲所有像素值的矩陣的指針,如圖 3.9 所示。矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依圖像的不同而不同,通常比矩陣頭的尺寸大數個數量級。複制矩陣資料往往花費較多時間,是以除非有必要,不要複制大的矩陣。

為了解決矩陣資料的傳遞,OpenCV 使用了引用計數機制。其思路是讓每個 Mat 對象有自己的矩陣頭資訊, 但多個 Mat 對象可以共享同一個矩陣資料。 讓矩陣指針指向同一位址而實作這一目的。 很多函數以及很多操作 (如函數參數傳值)隻複制矩陣頭資訊,而不複制矩陣資料。

前面提到過,有很多中方法建立 Mat 類。如果 Mat 類自己申請資料空間,那麼該類會多申請 4 個位元組,多出的 4 個位元組存儲資料被引用的次數。引用次數存儲于資料空間的後面,refcount 指向這個位置,如圖 3.9 所示。當計數等于 0時,則釋放該空間。

Mat 類的記憶體管理

繼續閱讀