“這孩子”,你知道我說的是OpenCV的Mat類,不知道在娘胎裡怎麼折騰呢,想不想一覽究竟呢,接下來就為你細細道來。
1
OpenCV中Mat類是一個是一個用來存放視圖像資料的結構,其中的資料可能是連續存儲的,也可能是不連續存儲的。
Mat類提供了一個接口來判斷其存儲的資料是否是連續的方法:isContinuous()。
如果是連續的傳回true,不連續傳回false。
Mat類的資料放在其一個叫做data的成員中。
2
今天介紹一下如何通路Mat類中包含的連續資料空間。通路連續的資料空間,說的通俗一點就是按照預設的規則從頭到尾周遊即可。多說無益,還是直接上代碼來的直接。請往下看:
3
Mat mat(3000, 4000, CV_8UC3);
int es = mat.elemSize();
int size = mat.rows * mat.cols * es;
for (int i = 0; i < size; i += es){
mat.data[i] = 255;//B
mat.data[i + 1] = 0; //G
mat.data[i + 2] = 255; //R
}
複制
4
關于此段代碼的說明:
(1) 3000, 4000是圖像的寬和高,CV_8UC3表示使用的像素格式,意思是一個像素用3個位元組表示,每一個位元組的類型是unsigned char(此處不想洗展開);
(2)elemSize()方法擷取每個像素所占的位元組大小;
(3)rows和cols表示圖像的行數和列數,但在使用時要注意,圖像的行數(rows)對應的是視訊的height,圖像的列數(cols)對應的是視訊的width;
(4)Mat包含的圖像資料的實際大小為: elemSize() * rows * cols;
(5)預設Mat類中包含的顔色空間安排格式為BGR;
(6)周遊連續的空間,使用for循環周遊即可。