1.Mat类简介
Mat类有两个数据部分:矩阵头(包含矩阵的大小,存储方法和存储地址)以及指向存储像素地址的指针。矩阵头的信息是常量,储存像素的地址会随着像素的大小而改变。
2.Mat的存储方式
图像Mat数据在电脑上的存储方式是按照以下方式存储的。
| row0 | row1 | row2 |
—------------------------------------------------------
| col0| col1| col2| col0| col1| col2| col0| col1| col2|
-------------------------------------------------------
|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|
|Pix0 |Pix1 |Pix2 |Pix3 |Pix4 |Pix5 |Pix6 |Pix7 |Pix8 |
3.指向地址的三种方式
1.指针方式,使用.ptr<uchar>(i,j)。
Mat image;
int cols = image.cols;
int rows = image.rows;
for (int i=0; i <rows, i++){
for (int j=0; j<cols, j++){
image_ele = image.ptr<uchar>(i,j);
}
}
//或者利用存储像素的指针首地址
Mat image;
int cols = image.cols;
int rows = image.rows;
for (int i=0; i <rows, i++){
uchar* curren_row = image.ptr<uchar>(i);
for (int j=0; j<cols, j++){
*current_now++ = 255 - current_row;
}
}
2.动态地址方式,使用.at<uchr>(i,j)。
Mat image;
int cols = image.cols;
int rows = image.rows;
for (int i=0; i <rows, i++){
for (int j=0; j<cols, j++){
image_ele = image.at<uchar>(i, j);
}
}
//对于灰度图,要使用image.at<uchar>(i, j)像素值。
//对于三色图,要使用NewImage.at<cv::Vec3b>(j, i)[k]取出单个像素的
3.迭代器方式,iterator
Mat_<Vec 3b>::iterator itbegin = image.begin<Vec 3b>();
Mat_<Vec 3b>::iterator itend = image.end<Vec 3b>();
for (; itbegin != itend; itbegin++){
int ele_b = *itbegin[0];
int ele_g = *itbegin[1];
int ele_r = *itbegin[2];
}