一、Mat的像素分布形式
参考链接:https://blog.csdn.net/farmwang/article/details/48103303?locationNum=5&fps=1
单通道:
多通道:
注意到多通道图像中每列并存三个通道的数据,访问的时候可以按照data[i],data[i+1],data[i+2]的形式访问
二、isContinuous()
可以加快访问速度,资料比多 在这里略过,主要看三的例子
如果是连续存储的,则上图可以理解为一行,列数 nCols *= nRows
三、两个例子
求图像BGR平均像素值
方法一、不需要判断isContinuous()直接访问,注意访问方式和上图对应起来
void test1(Mat testImg){
int nRows = testImg.rows;
int nCols = testImg.cols*testImg.channels();
int bAll = 0, gAll = 0, rAll = 0;
for (int i = 0; i < nRows; ++i){
uchar* data = testImg.ptr<uchar>(i);
for (int j = 0; j <nCols; j+=3){
int B = data[j];
int G = data[j+1];
int R = data[j+2];
bAll += B;
gAll += G;
rAll += R;
}
}
int bAvr = bAll / (testImg.rows*testImg.cols);//三个通道,分三个维度
int gAvr = gAll / (testImg.rows*testImg.cols);
int rAvr = rAll / (testImg.rows*testImg.cols);
cout << "test1: " << bAvr << ' ' << gAvr << ' ' << rAvr << endl;
}
方法二、利用isContinuous()加速访问
void test2(Mat testImg){
int nRows = testImg.rows;
int nCols = testImg.cols*testImg.channels();
if (testImg.isContinuous()){
nCols *= nRows;
nRows = 1;
}
int bAll = 0, gAll = 0, rAll = 0;
for (int i = 0; i < nRows; ++i){
uchar* data = testImg.ptr<uchar>(i);
for (int j = 0; j < nCols; j += 3){
int B = data[j];
int G = data[j + 1];
int R = data[j + 2];
bAll += B;
gAll += G;
rAll += R;
}
}
int bAvr = bAll / (testImg.rows*testImg.cols);
int gAvr = gAll / (testImg.rows*testImg.cols);
int rAvr = rAll / (testImg.rows*testImg.cols);
cout << "test2: "<<bAvr << ' ' << gAvr << ' ' << rAvr << endl;
}