mat 是opencv中使用非常頻繁的型別,這裡對其用法做一點總結。
常用的有三種方法,如下:
第一行用於直接讀取一幅影象。
第二行為標準的初始化格式,四個引數分別表示建立矩陣的長,寬,資料型別、通道,bgr的值。
(1)關於資料型別
cv_8u - 8-bit unsigned integers ( 0..255 )
cv_8s - 8-bit signed integers ( -128..127 )
cv_16u - 16-bit unsigned integers ( 0..65535 )
cv_16s - 16-bit signed integers ( -32768..32767 )
cv_32s - 32-bit signed integers ( -2147483648..2147483647 )
cv_32f - 32-bit floating-point numbers ( -flt_max..flt_max, inf, nan )
cv_64f - 64-bit floating-point numbers ( -dbl_max..dbl_max, inf, nan )
這裡還需要注意乙個問題,很多opencv的函式支援的資料深度只有8位和32位的,所以要少使用cv_64f;
(2)第四個引數一次設定各通道元素的值,一般rgb影象的資料型別都為8uc3,這邊也需要注意:
mat儲存影象的通道順序為bgr,所以上面**第二行表示把這個9*9,3
通道影象的r值都設為255,gb都為0.
第三行則是呼叫了create函式來進行初始化。
還有必要說一下mat的儲存是逐行的儲存的,m0.data是指向m0(0,0)的指標。
以下將總結一些常用的mat類成員函式
m1 = m0.clone(); //將m0完全拷貝到m1中,同時拷貝m0中的所有資料,且拷貝的矩陣是連續的。
所謂完全拷貝,就是不僅拷貝頭和指標,還會開闢一塊新的記憶體,將資料也複製過來。相比於下面的拷貝:
mat a(9,9,cv_8uc3,scalar(0,0,255));
mat b(a);
mat c=a;
這兩種方式,只拷貝了頭和指標,他們指向同乙個資料。也就是說如果a改變了,bc都會跟著改變。
m0.convertto(m1, type, scale, offset); //將m0中的元素轉換成type類(cv_32f等),作scale尺度的縮放,offset偏移,寫入m1中。
m0.setto(s,mask); //將m0中所有的元素的值設為s;如果使用mask,則只設定mask中的非零元素。
m0.reshape(chan, rows); //改變二維矩陣的的實際形狀,不進行資料拷貝;若chan或rows為0,則表示不作改變。
m0.iscontinuous(); //如果m0所有的行在記憶體空間中打包時都沒有間隙,則返回true。
m0.type(); //返回m0中元素的有效型別識別符號(如cv_32fc3)
m0.total(); //計算所有陣列元素的個數,不考慮通道。
m0.channels(); //返回m0中元素的通道數目。
m0.size(); //以cv::size物件的形式返回m0的大小。
m0.rows();//返回m0的行數。
m0.cols();//返回m0的列數。
m0.push_back(m1); //對mxn矩陣作k行擴充套件,並將m1拷貝到這些行中;m1的大小為kxn。
at函式用於訪問矩陣內某點的值,用法如下:
m0.at<>(i,j)[c];
其中<>內應填入m0元素的資料型別,uchar對應的是cv_8u,char對應的是cv_8s,int對應的是cv_32s,float對應的是cv_32f,double對應的是cv_64f。
若m0是多通道矩陣,則資料型別應為vec3b,c為當前處理的通道序號。i,j,c都是從零開始的。
OpenCV之Mat類詳解
學習mat矩陣,了解影象的儲存和mat矩陣的使用 2001年opencv剛出來的時候,是基於c語言介面而建。為了在記憶體 memory 中存放影象,當時採用名為 iplimage 的c語言結構體。其中最大的不足要數手動記憶體管理,使用者要為開闢和銷毀記憶體負責。一旦 開始變得越來越龐大,會越來越多地...
OpenCV3學習筆記(3) 認識Mat類及其建立
早期的opencv中,影象的處理是通過iplimage的c語言結構。從opencv2.0開始用c 重新實現,引入mat類使用引用計數的方式管理記憶體。mat類由兩部分組成 矩陣頭 包含矩陣的大小,儲存型別,儲存位址等資訊 以及乙個指向影象實際記憶體區域的指標。矩陣頭大小是恆定的,矩陣資料本身的大小可...
OpenCV基礎類容器Mat類詳解
我記得開始接觸opencv就是因為乙個演算法裡面需要2維動態陣列,那時候看core這部分也算是走馬觀花吧,隨著使用的增多,對mat這個結構越來越喜愛,也覺得有必要溫故而知新,於是這次再看看mat。mat最大的優勢跟stl很相似,都是對記憶體進行動態的管理,不需要之前使用者手動的管理記憶體,對於一些大...