Mat中的常用操作

2021-07-09 07:37:25 字數 2868 閱讀 7834

本章我們學習一下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資料情況下,便於資料處理,有時候我們會把2維矩陣變成一維矩陣。

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 img imread filename 如果你讀入乙個jpg檔案,預設情況下將建立乙個3通道影象。如果你需要灰度 單通道 影象,使用如下語句 mat img imread filename,0 將影象儲存到乙個檔案 mat img imwrite filename 要獲...

Mat操作中的幾種拷貝方式

mat是乙個具有兩個資料部分的類 矩陣頭和指向包含畫素值的矩陣的指標 mat image 方式一 image1的建立,只建立了頭部,與原來的image共享資料域部分 mat image1 image 方式二 image2完全拷貝image的所有資訊 mat image2 image.clone 方式...

python 矩陣(mat)操作

from python的numpy庫提供矩陣運算的功能,因此我們在需要矩陣運算的時候,需要匯入numpy的包。from numpy import 匯入numpy的庫函式 import numpy as np 這個方式使用numpy的函式時,需要以np.開頭。由一維或二維資料建立矩陣 from num...