#三种方法函数
- 迭代器
- 建立一个Mat::Iterator对象it,经过it=Mat::begin()来的到迭代首地址,递增迭代器知道it==Mat::end()结束迭代;
while (it != Scr.end<Vec3b>()) { //(*it)[0] = 0;//蓝色通道置零; (*it)[1] = 0;//绿色通道置零; //(*it)[2] = 0;//红色通道置零; it++; }
- 指针
- 调用函数 Mat::ptr(i) 来获得第i行的首地址地址,而后在行内访问像素
for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { Scr.ptr<Vec3b>(i)[j][0] = 0; } }
- 动态防问at
#at的使用指针
gray.at<uchar>(i, j) = 0; cv::mat的成员函数: .at(int y, int x)能够用来存取图像中对应坐标为(x,y)的元素坐标。可是在使用它时要注意,在编译期必需要已知图像的数据类型,这是由于cv::mat能够存听任意数据类型的元素。所以at方法的实现是用模板函数来实现的。code
template<typename _Tp> inline _Tp& Mat::at(int i0, int i1) { CV_DbgAssert(dims <= 2); CV_DbgAssert(data); CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())); CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1()); return ((_Tp*)(data + step.p[0] * i0))[i1]; }
假设提早已知一幅图像img的数据类型为 unsigned char型灰度图(单通道),要对坐标为(14,25)的像素从新赋值为25,则对应操做以下:
srcImage.at<uchar>(14,25) = 25;
若是要操做的图片img是一幅数据类型一样为unsigned char的彩色图片,再次要求将坐标(14,25)的像素赋值为25。这个操做跟上面的就有点区别了,须要对这个像素三个通道的每一个对应元素赋值,Opencv中图像三原色在内存中的排列顺序为B-G-R(见下面注释),操做过程以下:对象
img.at< Vec3b >(14,25) [0]= 25; img.at< Vec3b >(14,25) [1]= 25; img.at< Vec3b >(14,25) [2]= 25;