opencv的Mat類基本操作

2021-08-08 01:55:11 字數 4077 閱讀 4887

官方對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=

a.clone

();matg;

a.copyto(g

);

問題:如何建立roi?

你可以建立只引用部分資料的資訊頭。比如想要建立乙個感興趣區域( roi ),你只需要建立包含邊界資訊的資訊頭。

matd(

a,rect(10

,10,100

,100));

// using a rectangle

mate=a

(range:

all(),

range(1

,3));// using row and column boundariesq

其中range()指定感興趣行或列的範圍,range指從起始索引到終止索引(不包括終止索引)的一連續序列。

問題:影象的儲存方式

儲存畫素值需要指定顏色空間和資料型別。

常用的顏色空間: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...