参考
http://lib.csdn.net/article/opencv/28700?knId=1218
https://blog.csdn.net/xiaowei_cqu/article/details/19839019
https://blog.csdn.net/u011574296/article/details/70139563
int main(int argc, char ** argv)
{
Mat img(5, 3, CV_8UC3, Scalar(50, 50, 50));
cout << "rows:" <<img.rows << endl;
cout << "cols:" << img.cols << endl;
cout << "channels:" << img.channels() << endl;
cout << "dims:" << img.dims << endl;
// 每个元素大小,单位字节
cout << "elemSize:" <<img.elemSize() << endl; //1 * 3,一个位置,三个通道的CV_8U
// 每个通道大小,单位字节
cout << "elemSize1:"<<img.elemSize1() << endl; //1
/*
每一行(第一级)在矩阵内存中,占据的字节的数量
二维图像由一行一行(第一级)构成,而每一行又由一个一个点(第二级)构成
二维图像中step[0]就是每一行(第一级)在矩阵内存中,占据的字节的数量。
也就是说step[i]就是第i+1级在矩阵内存中占据的字节的数量。
*/
cout << "step[0]:" << img.step[0] << endl; //3 * ( 1 * 3 )
cout << "step[1]:" << img.step[1] << endl; //1 * 3
cout << "total:" << img.total() << endl; //3*5
//----------------------地址运算---------------------//
for (int row = 0; row < img.rows; row++)
{
for (int col = 0; col < img.cols; col++)
{
//[row,col]像素的第1通道地址解析为Blue通道
*(img.data + img.step[0] * row + img.step[1] * col) += 15;
//[row,col]像素的第2通道地址解析为Green通道
*(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1()) += 16;
//[row,col]像素的第3通道地址解析为Red通道
*(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1() * 2) += 17;
}
}
cout << "地址运算:\n" << img << endl;
//----------------------Mat的成员函数at<>()---------------------//
for (int row = 0; row < img.rows; row++)
{
for (int col = 0; col < img.cols; col++)
{
/*
.at return (img.data + step.p[0] * i0))[i1]
直接给[row,col]赋值,但是访问速度较慢
*/
img.at<Vec3b>(row, col) = Vec3b(0, 1, 2);
}
}
cout << "成员函数at<>():\n" << img << endl;
//----------------------Mat的成员函数ptr<>()---------------------//
int nr = img.rows;
int nc = img.cols * img.channels();//每一行的元素个数
for (int j = 0; j < nr; j++)
{
uchar* data = img.ptr<uchar>(j);
for (int i = 0; i < nc; i++)
{
*data++ += 99;
}
}
cout << "成员函数ptr<>():\n" << img << endl;
}