#三種方法函數
- 迭代器
- 建立一個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;