OpenCV Mat資料型別構造

2021-08-28 10:34:23 字數 2796 閱讀 1346

mat 的大致的資料結構可以理解為 row * col 規模的矩陣,矩陣中的每個元素,是規格統一但不確定的資料元,統稱為scalar,而scalar的格式大致為[a(,b,c,d)]這樣的向量或者標量,向量的長度有時可以被理解為通道數,資料的具體型別有時可以被理解為深度,即該數占用多少位元來完成描述。

mat(int rows, int cols, int type);
rows規定行數,cols規定列數

type可以使用一些預置的巨集,如cv_8uc1,cv_64fc4

cv_8uc3 => cv_8u(nsigned)c(hannel)3 => 8位無符號整數 3通道

得到的就是乙個rows * cols規模的矩陣,而矩陣中的每個元素,又是維數為3,每一維取值範圍為0-255的向量

也可以使用約定的函式來直接構造可能需要的資料元型別

如cv_8uc(n),cv_64fc(n)

size size(int rows, int cols);

mat(size size, int type);

應該可以理解,即將rows和cols結合在一起作為不可分割的訊息傳入構造

scalar s(a); // s = [a]

scalar s(a, b, c, d); // s = [a, b, c, d]

mat(int rows, int cols, int type, const scalar& s);

在原先的基礎上,附加了乙個引數 s ,用於將矩陣中所有的資料項初始化為特定的scalar標量,由於資料項的深度和通道數都有可能不同,故scalar需要符合前面type引數所規定的格式

上面補充了構建各類scalar資料元的方法,由於採用了模板的概念,scalar的定義方法比較靈活,直接向建構函式中傳入1-4個(可能有誤)符合深度要求(即資料型別)的數即可

mat(int ndims, const int* sizes, int type);
指定該矩陣有ndims維,其中第1維長度為sizes[0],第二維長度為sizes[1] … ,且資料型別為type

mat(const std::vector& sizes, int type);
功能同上,由於vector可以動態獲取有效長度,故少乙個引數

mat(int ndims, const int* sizes, int type, const scalar& s);
其功能可以通過上面介紹過的函式組合推斷得到

mat(const std::vector& sizes, int type, const scalar& s);
其功能可以通過上面介紹過的函式組合推斷得到

mat(const mat& m);
基於乙個已有的mat構造乙個新的mat,但是是乙個淺拷貝,對構造出的mat內的資料的變動會影響到原副本內的資料。建議使用mat::clone()進行深拷貝。

mat(int rows, int cols, int type, void* data, size_t step=auto_step);
由於mat的本質資料是data指標所指向的資料集合,因此提供直接將符合條件的資料集直接分派給mat物件進行格式化處理的手段。這裡還涉及到乙個可以預設step引數,用於表明一行資料所佔的實際位元數,用於應對給定data資料集中的一種情況,即每一行資料的尾部,都存在一些填充位元組的情況。比如:

1 2 3 x x

4 5 6 x x

即保證對於這種情況能正確地連帶著填充位元分離出每一行。

該構造方法的應用要求data指向的資料集合是連續儲存的,而且該方法只是簡單的將指標指向資料域,相當於乙個引用,而沒有建立實際的儲存空間。

mat(size size, int type, void* data, size_t step=auto_step);
其功能可以通過上面介紹過的函式組合推斷得到

mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);
其功能可以通過上面介紹過的函式組合推斷得到

mat(const std::vector& sizes, int type, void* data, const size_t* steps=0);
其功能可以通過上面介紹過的函式組合推斷得到

range r(int _start, int _end);

mat(const mat& m, const range& rowrange, const range& colrange=range::all());

從原矩陣中m,用行的範圍和列的範圍切分出乙個子矩陣並送回,range物件的定義較為方便。但是要注意這個子矩陣提取是以一種引用的方式實現的, 故會存在相互影響的情況

rect roi(int x, int y, int xwidth, int yheight);

mat(const mat& m, const rect& roi);

功能和上乙個提到的相同,但是這個是採用乙個描述長方形的物件rect來描述切割的範圍,rect是rect_模板類的乙個特例,其一種較為直觀的定義方式如上,採用x,y,width,height四個整數完成定義

還有若干基於template的建構函式,暫時不列舉

OPENCV Mat的資料型別

1.opencv中mat存在各種型別,其中mat有乙個type 的函式可以返回該mat的型別。型別表示了矩陣中元素的型別以及矩陣的通道個數,它是一系列的預定義的常量,其命名規則為cv 位數 資料型別 通道數 具體的有以下值 2.注意在用at運算子訪問mat時,需特別注意資料型別。3.很坑的一點,op...

OpenCV mat資料型別及位數

float 4位元組 6 7位有效數字 3.4e 38 到 3.4e38 double 8位元組 15 16位有效數字 1.7e 308 到 1.7e308 在opencv裡面,許多資料結構為了達到記憶體使用的最優化,通常都會給它最小上限的空間來分配變數,有的資料結構也會因為影象檔案格式的關係而給予...

OpenCV Mat資料型別及位數總結

opencv mat資料型別及位數總結 float 4位元組,6 7位有效數字 3.4e 38 到 3.4e38 double 8位元組,15 16位有效數字 1.7e 308 到 1.7e308 在opencv裡面,許多資料結構為了達到記憶體使用的最優化,通常都會用它最小上限的空間來分配變數,有的...