OpenCV中Mat類的介紹和使用

2021-08-15 21:45:11 字數 1311 閱讀 8436

自從opencv產生以來,其函式庫一直是基於c介面構建的,因此在最初的幾個opencv版本中,一般使用名為iplimage的c語言結構體在記憶體中儲存影象。直到現在,仍然出現在大多數的舊版教程中。

對於opencv1.x時代的基於c語言介面而建的影象儲存格式iplimage*,如果在退出前忘記release掉的話,就會造成記憶體洩漏,而且用起來也很不方便,我們在除錯的時候,往往也會花費很多時間在手動釋放記憶體的問題上面。雖然對於小型的程式來說,手動管理記憶體不是問題,但如果**量很大的話,維護的成本就會越來越大,我們便會開始越來越多的糾纏於記憶體管理的問題,而不是著力解決最終的開發目標。

c++帶來了類的概念,這使我們有了另外乙個選擇:自動的記憶體管理,在opencv2.0版本中引入了乙個新的c++介面,利用自動記憶體管理給出了解決問題的新方法。使用此方法,我們不需要再糾結在管理記憶體的問題,而且**會變得乾淨整潔。

關於mat類,我們首先應該知道的是:

不必再手動為其開闢空間。

不必再在不需要時立即將空間釋放。

當傳遞乙個已經存在的mat物件時,開闢好的矩陣空間會被重用。也就是說,我們每次都使用大小正好的記憶體來完成任務。

總而言之,mat是乙個類,由兩個資料部分組成:矩陣頭(包含矩陣尺寸、儲存方法、儲存位址等資訊)和乙個指向儲存所有畫素值的矩陣(根據所選儲存方法的不同,矩陣可以是不同的維數)的指標。矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依據影象的不同而不同,通常比矩陣頭的尺寸大幾個數量級。因此當在程式中傳遞影象並建立副本時,大的開銷是由矩陣造成的。而不是資訊頭。所以當我們在編寫影象處理演算法時,儘量減少大影象的複製,因為這會降低程式的執行速度。

為了解決這個問題,opencv引用計數機制。讓每個mat物件有自己的資訊頭,但共享乙個矩陣。通過讓矩陣指標指向同一位址而實現。而拷貝建構函式則只複製資訊頭和矩陣指標,而不複製矩陣。

例如:mat  src,dst;//只建立資訊頭部分

src  = imread("1.jpg");  //這裡為矩陣開闢記憶體

mat  dst(src);   //使用拷貝建構函式

dst = src;   //賦值運算子

以上**中所有的mat物件都指向同乙個也是唯一乙個資料矩陣。雖然他們的資訊頭不同,但通過任何乙個物件所做的改變也會影響其他物件。實際上,不同物件只是訪問相同資料的不同途徑。

如果矩陣屬於多個mat物件,那麼當不再使用它時,最後乙個使用的物件負責清理。但某些時候你還想複製矩陣本身(不只是矩陣頭和矩陣指標,這時可以使用clone()和copyto()。

總結:

opencv中mat類引數釋義

type 型別 cv 8uc1 8 位單通道陣列 cv 32fc2 2 通道 復平面 浮點陣列 define cv 8uc1 cv maketype cv 8u,1 define cv 8uc2 cv maketype cv 8u,2 define cv 8uc3 cv maketype cv 8u...

OpenCV中核心類Mat的建立方式

mat 的建立方方式 mat int rows,int cols,int type 其中,rows代表矩陣的行數,cols代表矩陣的列數,type代表型別,包括通道數及其資料型別,可以設定為cv 8uc n cv 8sc n cv 16sc n cv 16uc n cv 32sc n cv 32fc...

OpenCV之Mat類詳解

學習mat矩陣,了解影象的儲存和mat矩陣的使用 2001年opencv剛出來的時候,是基於c語言介面而建。為了在記憶體 memory 中存放影象,當時採用名為 iplimage 的c語言結構體。其中最大的不足要數手動記憶體管理,使用者要為開闢和銷毀記憶體負責。一旦 開始變得越來越龐大,會越來越多地...