OpenCV Mat的簡單構造和讀取

2021-09-21 18:13:57 字數 1628 閱讀 9240

cv::mat mat_rown_colm = cv::mat (rown, colm, type);

type:cv_c

cv::mat mat_rown_colm = cv::mat (rown, colm, cv_c1);

元素的訪問方式:位置or迭代器。

直接訪問:模板函式at<>(),先將at<>()特化到矩陣所包含的資料型別,然後再通過資料的行、列進行元素的訪問。

對於單通道:

cv::mat m23 = cv::mat(2,3,32fc1);

m23.at(row, col); 

對於多通道:

cv::mat m23 = cv::mat(2,3,32fc3);

m23.at(row,col)[channel];

如果採用單通道的訪問方式,將會依次訪問元素i的1、2、3通道,比如:

m23.at(0,0)  //第1個元素的第1個通道c1

m23.at(0,1)  //第1個元素的第2個通道c2

m23.at(0,2)  //第1個元素的第3個通道c3

m23.at(0,3)   //第2個元素的第1個通道c1

對於多通道使用模板結構:簡化介面

cv::mat_m23(2, 3);

m23.at(x, y) = cv::vec3f(a, b, c);

陣列中的資料是按行連續組織的,不能直接訪問乙個特定的列:訪問二維陣列,可以用指標來指定某一行,再找到對應的列元素

模板函式ptr<>()

例子1:(給定乙個float單通道的矩陣mtx)

cv::mat mtx23= cv::mat::ones(2, 3, cv_32fc1);

//data0是矩陣第1行的指標

float *data0 = mtx23.ptr(0);

//data1是矩陣第2行的指標

float *data1 = mtx23.ptr(1);

例子2:(給定乙個float三通道的矩陣mtx)

cv::mat mtx23 = cv::mat::zeros(2, 3, cv_32fc3);

//data1是矩陣第1行的指標

vec3f *data1 = mtx23.ptr(0);

//訪問第1行第1個元素的三個通道

(*data1)[0] = 0;

(*data1)[1] = 1;

(*data1)[2] = 2;

//訪問第1行第2個元素的三個通道

(*(data1 + 1))[0] = 3;

(*(data1 + 1))[1] = 4;

(*(data1 + 1))[2] = 5;

//data2是矩陣第2行的指標

vec3f *data2 = mtx23.ptr(1);

//訪問第2行第1個元素的三個通道

(*data2 )[0] = 0;

(*data2 )[1] = 1;

(*data2 )[2] = 2;

//訪問第2行第2個元素的三個通道

(*(data2 + 1))[0] = 3;

(*(data2 + 1))[1] = 4;

(*(data2 + 1))[2] = 5;

OpenCV Mat資料型別構造

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

OpenCV Mat和IplImage的轉換

iplimage是opencv1裡面用於儲存影象的資料結構,到了opencv2裡面,這一結構被更方便易用的mat型別取代。然而,在實際中,很多以前的opencv 用的都是iplimage,因此進行mat和iplimage的相互轉換經常被用到,下面利用 實現兩者間的相互轉換。mat matimg ip...

OpenCV Mat和IplImage的轉換

iplimage是opencv1裡面用於儲存影象的資料結構,到了opencv2裡面,這一結構被更方便易用的mat型別取代。然而,在實際中,很多以前的opencv 用的都是iplimage,因此進行mat和iplimage的相互轉換經常被用到,下面利用 實現兩者間的相互轉換。mat matimg ip...