1、使用at<Vec3b>(i, j) 和at<uchar>(i, j)
cv::Mat img = imread("test.jpg");
int rows = img.rows;
int cols = img.cols;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
//彩色图像获取到单个像素
Vec3b pix = img.at<Vec3b>(i,j);
//灰度图像获取单个像素
uchar gray = img.at<uchar>(i,j);
//获取到RGB分量的值。
uchar B = pix[0];
uchar G = pix[1];
uchar R = pix[2];
//或者使用下面的方法
//uchar B = img.at<Vec3b>(i, j)[0];
//uchar G = img.at<Vec3b>(i, j)[1];
//uchar G = img.at<Vec3b>(i, j)[2];
}
}
2、使用ptr函数和指针 (高效遍历)
cv::Mat img = imread("test.jpg");
int rows = img.rows;
int cols = img.cols;
for (int i = 0; i < rows; i++)
{
//获取图像每一行的首地址
Vec3b *p = img.ptr<Vec3b>(i);//彩色图 //p指向地址
uchar *p2 = grayImg.ptr<uchar>(i);//灰度图 //*p指向内容
for (int j = 0; j < cols; j++)
{
//每次迭代获取图像列的地址
Vec3b &pix = *p++;//彩色图 //pix指向内容
uchar &pix2 = *p2++;//灰度图 //&pix指向地址
//uchar B = pix[0];
//uchar G = pix[1];
//uchar G = pix[2];
}
}