OpenCV訪問像素點

#三種方法函數

  • 迭代器
    • 建立一個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;
相關文章
相關標籤/搜索