OpenCV 學習筆記(一)Mat

2021-08-15 04:32:36 字數 3764 閱讀 7580

opencv是由c語言實現的,實際上它使用的結構體也是遵循物件導向思想設計的,iplimage由cvmat派生

資訊)和乙個指向儲存所有畫素值的矩陣(根據所選儲存方法的不同矩陣可以是不同的維數)的指標。

mat矩陣頭:包括

typedef struct cvmat

data;

#ifdef __cplusplus

union

;union

;#else

int rows;

int cols;

#endif

}cvmat;

每個 mat 物件有自己的資訊頭,但共享同乙個矩陣。這通過讓矩陣指標指向同一位址而實現。而拷貝構造

函式則 只拷貝資訊頭和矩陣指標 ,而不拷貝矩陣。

mat 不但是乙個很讚的影象容器類,它同時也是乙個通用的矩陣類,所以可以用來建立和操作多維矩陣

直接從讀入;使用拷貝建構函式;使用賦值運算子;

mata,

c;// 只建立資訊頭部分a=

imread

(argv[1

],cv_load_image_color

);// imread讀取影象(第乙個引數為影象路徑需傳入,第二個是影象顏色型別

matb(

a);// 使用拷貝建構函式c=

a;// 賦值運算子

matd(

a,rect(10

,10,100

,100));

//對a建立乙個rio感興趣區域

mate=a

(range:

all(),

range(1

,3));// 使用range函式利用a的行列賦值給

以上**中的所有mat物件最終都指向同乙個也是唯一乙個資料矩陣,最後乙個使用mat的物件會負責清理。

如果想拷貝矩陣本身(不只是資訊頭和矩陣指標),這時可以使用函式 clone() 或者 copyto()。

matf=

a.clone

();matg;

a.copyto(g

);

使用mat矩陣影象容器類的建構函式建立mat類物件
//載入原始影象1.jpg

//建立乙個和原始影象srcimg高和寬一致的8位無符號單通道的灰度容器,並且初始化為白色255

mat grayimg(srcimg.

rows,srcimg.cols,cv_8uc1,scalar(255));

為已經存在的iplimage指標建立資訊頭
//宣告iplimg指標

iplimg* imgtopdown;

//將載入到記憶體中

//為已經存在的imgtopdown指標建立資訊頭

//轉換iplimage*--->mat

mat mtx(imgtopdown);

利用create()函式建立mat矩陣影象容器類的物件
//【1】載入原始影象1.jpg

//【2】建立乙個和原始影象srcimg高和寬一致的8位無符號單通道的灰度容器,並且初始化為白色255

mat dstimg.create(srcimg.rows,srcimg.cols,cv_8uc1);

//! matlab-style matrix initialization

static matexpr zeros(int rows, int cols, int type);

static matexpr zeros(size size, int type);

static matexpr zeros(int ndims, const

int* sz, int type);

static matexpr ones(int rows, int cols, int type);

static matexpr ones(size size, int type);

static matexpr ones(int ndims, const

int* sz, int type);

static matexpr eye(int rows, int cols, int type);

static matexpr eye(size size, int type);

//載入原始影象1.jpg

//建立乙個和原始影象srcimg高和寬一致的8位無符號單通道的灰度容器,並且初始化為白色255

mat dstimg=mat::zeros(srcimg.rows,srcimg.cols,cv_8uc3);

mat dstimg=mat::ones(srcimg.rows,srcimg.cols,cv_8uc3);

mat dstimg=mat::eye(srcimg.rows,srcimg.cols,cv_8uc3);

type--所建立影象/矩陣的型別
這裡的type可以是任何的預定義型別,預定義型別的結構如下所示:
cv_(s|u|f)c
1--bit_depth---位元數---代表8bite,16bites,32bites,64bites---舉個例子吧--比如說,如

如果你現在建立了乙個儲存--灰度的mat物件,這個影象的大小為寬100,高100,那麼,現在這張

灰度中有10000個畫素點,它每乙個畫素點在記憶體空間所佔的空間大小是8bite,8位--所以它對

應的就是cv_8

2--s|u|f--s--代表---signed int---有符號整形

u--代表--unsigned int--無符號整形

f--代表--float---------單精度浮點型

3--c----代表---一張的通道數,比如:

1--灰度--grayimg---是--單通道影象

2--rgb彩色影象---------是--3通道影象

3--帶alph通道的rgb影象--是--4通道影象

--通過上面的講解,現在,我們解讀一下opencv的源**:
//cv_8uc1---則可以建立----8位無符號的單通道---灰度------grayimg

#define cv_8uc1 cv_maketype(cv_8u,1)

#define cv_8uc2 cv_maketype(cv_8u,2)

//cv_8uc3---則可以建立----8位無符號的三通道---rgb彩色影象---colorimg

#define cv_8uc3 cv_maketype(cv_8u,3)

//cv_8uc4--則可以建立-----8位無符號的四通道---帶透明色的rgb影象

#define cv_8uc4 cv_maketype(cv_8u,4)

原部落格:

OpenCV中Mat 型別學習筆記

printf img.size 函式返回值 n cout 報錯 原因,mat.step1 0 需要用圓括弧 mat的step,size,step1,elemsize,elemsize1這幾個屬性非常容易混淆。opencv的官方參考手冊也沒有解釋清楚這幾個概念。step1 i 每一維元素的通道數 st...

OpenCV學習筆記七 關於Mat類

1 建立乙個mat物件僅僅是建立了資訊頭部分,並沒有複製影象矩陣,而是通過矩陣指標指向某一位址而實現。eg mat a,c 僅建立資訊頭部分 mat b a 使用拷貝建構函式 c a 賦值運算子 以上建立的所有mat物件最終都指向同乙個也是唯一的乙個資料矩陣。雖然資訊頭不同,但是通過任何乙個物件所做...

opencv學習筆記之Mat元素訪問

mat元素訪問方法如下 declare template tp cv mat at int i0 0 cv mat h 100 100 cv 64f 初始化 for int i 0 i h.rows i for int j 0 j h.cols j h.at double i,j 1.i j 1 賦...