OpenCV學習 5 Mat的基本操作 2

2021-08-04 18:52:49 字數 2800 閱讀 2271

本章我們學習一下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;

int cols = m.cols, rows = m.rows;

if(m.iscontinuous())

for(int i = 0; i < rows; i++)

4. 用下面的**,可以取出矩陣的某個roi區域,以便進行處理。

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...