1、利用.at函数来访问Mat容器的像素单元
- image.at<uchar>(i, j)
(1)这就访问到了unsigned char型的二维矩阵image的第i行第j列的元素。这种情况可以直接应用在灰度图像素的访问上。因为灰度图是单通道的,每个元素位置可以单独表征的一个像素元素的像素值。
(2)对于RGB图像来说,有三个通道(OpenCV中三通道的排列方式是BGR),则用 <Vec3b>代替<uchar>就可以了。它的含义是,将RGB图看做是三个二维矩阵按页数排列起来。即将RGB图看作是一个x行y列3页的三维矩阵,其中的3页分别按0、1、2的序号顺序存着B、G、R分量对应的数值,对于RGB图像上的(i,j)位置元素的像素值,是3页上相应位置的分量值按一定加权系数的方式相加得到的结果。
因此访问RGB图像的像素单元就要分别访问三个分分量,方式如下:
- image.at<Vec3b>(i,j) [0] //> B
- image.at<Vec3b>(i,j) [1] //> G
- image.at<Vec3b>(i,j) [2] //> R
(3)对于任意D维度的Mat容器,访问任意元素也是可以用.at函数来实现的。
- mat.at<style>(i, j, k...n) //> n为矩阵第i行第j列第k页...第n维的元素
当然,在D=3的时候可以认为访问的就是RGB图像。
2、step类对象和size类对象
(1)对于大小为row行col列的二维图像来说,size类对象的成员变量size.p[0]=row,size.p[1]=col;step类对象的成员变量step.p[0]=size.p[0]*sizeof(unsigned char),
step.p[1]=sizeof(unsigned char)。既size内存放的是图像每个维度的元素数量,step存放的是每个维度占据的内存空间大小。对于非图像的其他二位Mat容器对象,也有类似的定义,只不过需要注意sizeof(style)的类型就可以了。
(2)对于int类型的三维矩阵cube(row,col,page)来说,我们把他理解为二维水平面x、y在竖直深度方向z的堆叠。因此size.p[0]=row、size.p[1]=col、size.p[2]=page分别代表x、y、z方向的元素数目。step.p[0]=row*clo*sizeof(int)、step.p[1]=row*sizeof(int)、step.p[2]=sizeof(int)。比如想要访问三维矩阵cube的第(i,j,k)个元素,则可以通过cube.at<int>(i, j, k)来达到访问这个元素的目的。但是如果想访问这个元素所占的内存单元(就像C风格指针操作那样),则需要point = k*step.p[0] + i*step.p[1] + j*step.p[2]。
(3)对于大于三维的Mat容器对象,接口函数.at则不能继续工作了,通过.at访问像素的功能仅支持3维及以下的数据形式,对于大于三维的数据,只能通过上面介绍的访问内存的方式来进行读写。