本章我們學習一下mat中的常用操作,因為在後面其它的教程中,我們經常要對影象進行各種處理,也要使用這些操作。
一、 mat的複製,
就是從乙個矩陣a,生成相關的另乙個矩陣b。
(1)使用賦值的方法,比如通過建構函式生成矩陣n,通過複製生成矩陣p
cv::mat n(m);
cv::mat p;
p=m;
這樣生成的矩陣,只是新生成乙個矩陣頭,它的data依然指向矩陣m的data,類似c++中的淺拷貝,比如矩陣m,n,p它們的data都指向位址0x00badd50
(2) 使用copyto和clone函式
cv::mat f = m.clone();
cv::mat g;
f.copyto(g);
這樣可以生成乙個全新的矩陣,不但複製矩陣的頭資訊,而且會生成乙個data的拷貝。比如矩陣f和m,它們的data指標位址和f是不同的。
注意:copyto函式,它還可以帶有掩碼矩陣copyto(g, maskimage), maskimage是乙個單通道的矩陣,值為0的位置,在拷貝時候並不會拷貝。
二、mat中常用的幾個函式
1. convertto
(outputarraym, intrtype, doublealpha=1, doublebeta=0 )
生成乙個新矩陣,矩陣的中值為原矩陣中的值乘以alpha,然後再加上beta
imagemask.convertto(mark1,cv_8u);
2. mat::reshape(int cn),改變矩陣的維數,比如把二維矩陣改變成一維矩陣。這個操作只是改變矩陣的頭資訊,比如在沒有padding資料情況下,便於資料處理,有時候我們會把二維矩陣變成一維矩陣。
imagemask.reshape(1);
3. iscontinous,檢測矩陣是否有padding資料。
double sum=0;4. 用下面的**,可以取出矩陣的某個roi區域,以便進行處理。int cols = m.cols, rows = m.rows;
if(m.iscontinuous())
for(int i = 0; i < rows; i++)
cv::rect rect(100, 100, 100, 100);
srcimage(rect).copyto(roiimage);
5.下面的**,實現乙個矩陣的子矩陣賦值,矩陣roi的data指標會指向result1的data的50行,70列處。
cv::mat result1= cv::mat(image1.rows, image1.cols,cv_8uc1, cv::scalar(cv::gc_bgd));
//注意給子矩陣賦值的方法
cv::mat roi(result1, cv::rect(50,70,result1.cols-150,result.rows-180));
roi = cv::scalar(cv::gc_pr_fgd);
三、簡單的三維矩陣示例
//建立乙個3維矩陣,每維都是長度為2
int sz[3] = ;
cv::mat l(3,sz, cv_8uc(1), cv::scalar::all(1));
//列印多維陣列
for(i=0; i< 3; i++) }
} 四、稀疏矩陣
有時候,我們需要使用多維矩陣儲存一些值,比如三維bgr影象的直方圖,由於每維的索引數都是256,所以矩陣元素數量達到256*256*256,如果用普通矩陣儲存,需要分配很大的空間,這時候,最好使用稀疏矩陣sparsemat,因為在稀疏矩陣中只儲存非零的值。
下面是使用稀疏矩陣的簡單例子:
//稀疏矩陣的操作
//建立乙個三維的稀疏矩陣
const int dims = 3;
int size = ;
sparsemat sparse_mat(dims, size, cv_32f);
//20個非0的值,注意:稀疏矩陣儲存非零的值
for(int i = 0; i < 20; i++)
//顯示稀疏矩陣的結果
sparsematconstiterator_it1 = sparse_mat.begin(), it_end = sparse_mat.end();
double s = 0;
int dims1 = sparse_mat.dims();
for(; it1 != it_end; ++it1)
printf("元素的個數 %g\n", s);
程式執行的結果:
opencv的Mat類基本操作
官方對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 va...
OpenCV學習 4 Mat的基本操作 1
影象在opencv中都是通過mat類來儲存的,mat可以用來表示n維矩陣,當然用的最多的還是二維矩陣。mat類有兩部分組成 第一部分是頭資訊,這些資訊主要用來描述矩陣,比如矩陣維數ndims,rows,cols 這兩個成員變數主要用於二維矩陣,用來表示行數和列數 size,sizes,type,st...
OpenCV學習 4 Mat的基本操作 1
影象在opencv中都是通過mat類來儲存的,mat可以用來表示n維矩陣,當然用的最多的還是二維矩陣。mat類有兩部分組成 第一部分是頭資訊,這些資訊主要用來描述矩陣,比如矩陣維數ndims,rows,cols 這兩個成員變數主要用於二維矩陣,用來表示行數和列數 size,sizes,type,st...