官方對mat介紹的原話:
the class mat represents an n-dimensional dense numerical single-channel or multi-channel array. it can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms may be better stored in a sparsemat
譯文:mat類用於表示乙個多維的單通道或者多通道的稠密陣列。能夠用來儲存實數或複數的向量、矩陣,灰度或彩色影象,立體元素,點雲,張量以及直方圖(高維的直方圖使用sparsemat儲存比較好)。簡而言之,mat就是用來儲存多維的矩陣的.
opencv2的mat類帶來的改變:
1不必手動開闢空間 2不必再在不需要的時候立即將空間釋放
mat由兩個資料部分組成:矩陣頭(包含矩陣尺寸、儲存方法、儲存位址等資訊)和乙個指向儲存所有畫素值的矩陣的指標。
問題:關於影象拷貝問題?
opencv使用引用計數機制來解決複製影象的問題。其思路是讓每個 mat 物件有自己的資訊頭,但共享同乙個矩陣。這通過讓矩陣指標指向同一位址而實現。而拷貝建構函式則只拷貝資訊頭和矩陣指標,而不拷貝矩陣。
mat a, c; // 只建立資訊頭部分
a = imread(argv[1], cv_load_image_color); // 這裡為矩陣開闢記憶體
mat b(a); // 使用拷貝建構函式
c = a; // 賦值運算子
以上**中的所有mat物件最終都指向同乙個也是唯一乙個資料矩陣。
如果想讓各自物件都有乙個資訊頭和矩陣,這時候可以使用cone()和copyto()兩個成員函式。
matf=問題:如何建立roi?a.clone
();matg;
a.copyto(g
);
你可以建立只引用部分資料的資訊頭。比如想要建立乙個感興趣區域( roi ),你只需要建立包含邊界資訊的資訊頭。
matd(其中range()指定感興趣行或列的範圍,range指從起始索引到終止索引(不包括終止索引)的一連續序列。a,rect(10
,10,100
,100));
// using a rectangle
mate=a
(range:
all(),
range(1
,3));// using row and column boundariesq
問題:影象的儲存方式
儲存畫素值需要指定顏色空間和資料型別。
常用的顏色空間:rgb hsv hls 灰度級空間 等。
mat和matlab裡的陣列格式有點像,但一般是二維向量,如果是灰度圖,一般存放
型別;如果是rgb彩色圖,存放型別。
單通道灰度圖資料存放格式:
多通道的影象中,每列並列存放通道數量的子列,如rgb三通道彩色圖:
注意通道的順序反轉了:bgr。通常情況記憶體足夠大的話影象的每一行是連續存放的,也就是在記憶體上影象的所有資料存放成一行,這中情況在訪問時可以提供很大方便。可以用 iscontinuous()函式來判斷影象陣列是否為連續的。
問題:如何訪問影象中的畫素
訪問影象中畫素的三個方法:
1.指標訪問:c操作符
2.迭代器iterator
3.動態位址計算
三種方法在訪問速度上有差異
第一種:用指標訪問 訪問速度最快
void colorreduce(mat& inputimage,mat& outputimage,int div)
//*data++ = *data / div*div + div / 2; //所有方法中最快的}
第二種:用迭代器操作畫素
這裡,我們只需要獲取影象矩陣的begin和end,然後增加迭代直至從begin到end。將*操作符新增到迭代指標前,即可訪問當前指向的內容。相比指標容易產生越界的情況,迭代器是絕對安全的
void colorreduce(mat& inputimage,mat& outputimage,int div)
第三種:動態位址計算
void colorreduce(mat& inputimage,mat& outputimage,int div)
} }
問題:如何顯式地建立乙個mat物件
mat 不但是乙個很讚的影象容器類,它同時也是乙個通用的矩陣類,所以可以用來建立和操作多維矩陣。建立乙個mat物件有多種方法:
一:mat() 建構函式
顯示結果:
scalar 是個short型vector。指定這個能夠使用指定的定製化值來初始化矩陣.
二:create()
結果:
這個建立方法不能為矩陣設初值,它只是在改變尺寸時重新為矩陣資料開闢記憶體
三:matlab形式的初始化方式: zeros(), ones(), :eyes() 。使用以下方式指定尺寸和資料型別:
結果:
mat的常見屬性
1:data uchar型的指標。mat類分為了兩個部分:矩陣頭和指向矩陣資料部分的指標,data就是指向矩陣資料的指標
2:dims 矩陣的維度,例如5*6矩陣是二維矩陣,則dims=2,三維矩陣dims=3.
3:rows 矩陣的行數
4:cols 矩陣的列數
5:size 矩陣的大小,size(cols,rows),如果矩陣的維數大於2,則是size(-1,-1)
6:channels 矩陣元素擁有的通道數
7:type 表示了矩陣中元素的型別以及矩陣的通道個數,它是一系列的預定義的常量,其命名規則為cv_(位數)+(資料型別)+(通道數)。具體的有以下值:
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
8:depth 矩陣中元素的乙個通道的資料型別,這個值和type是相關的。例如 type為 cv_16sc2,乙個2通道的16位的有符號整數。那麼,depth則是cv_16s。depth也是一系列的預定義值,
關於使用data訪問影象中畫素的一些問題:
OpenCV學習 4 Mat的基本操作 1
影象在opencv中都是通過mat類來儲存的,mat可以用來表示n維矩陣,當然用的最多的還是二維矩陣。mat類有兩部分組成 第一部分是頭資訊,這些資訊主要用來描述矩陣,比如矩陣維數ndims,rows,cols 這兩個成員變數主要用於二維矩陣,用來表示行數和列數 size,sizes,type,st...
OpenCV學習 5 Mat的基本操作 2
本章我們學習一下mat中的常用操作,因為在後面其它的教程中,我們經常要對影象進行各種處理,也要使用這些操作。一 mat的複製,就是從乙個矩陣a,生成相關的另乙個矩陣b。1 使用賦值的方法,比如通過建構函式生成矩陣n,通過複製生成矩陣p cv mat n m cv mat p p m 這樣生成的矩陣,...
OpenCV學習 4 Mat的基本操作 1
影象在opencv中都是通過mat類來儲存的,mat可以用來表示n維矩陣,當然用的最多的還是二維矩陣。mat類有兩部分組成 第一部分是頭資訊,這些資訊主要用來描述矩陣,比如矩陣維數ndims,rows,cols 這兩個成員變數主要用於二維矩陣,用來表示行數和列數 size,sizes,type,st...