我们只要使用的图像多为三通道和单通道。
对于三通道来说,每一个像素的位置内含了三个uchar数据,所以对三通道获取像素值要使用Vec3b。Vec3b实质上是一个uchar的数组,最多能装三个数据。
对于单通道,可以直接使用mat.at<uchar>(row,col)即可获取像素值。
三通道图像读取像素值的代码如下:
int main()
{
Mat src = Mat::zeros(5, 5, CV_8UC3);//建立一个三通道的图像
cout << "src"<<endl<<src << endl;
Vec3b i = src.at<Vec3b>(2, 2);//获取(2,2)位置的像素值,这里用了mat.at<Vec3b>(2,2),返回一个Vec3b类型的数组
cout << "i" << endl << i << endl;
int a = (int)i[0];//因为Vec3b是uchar型,i[0]中是\0,就是空格。这里要转换为int
cout << a << endl;
waitKey(0);
return 0;
}
单通道的图像读取像素值的代码如下:
int main()
{
Mat src = Mat::zeros(5, 5, CV_8UC1);//建立一个三通道的图像
cout << "src"<<endl<<src << endl;
uchar i = src.at<uchar>(2, 2);//获取(2,2)位置的像素值,这里用了mat.at<Vec3b>(2,2),返回一个Vec3b类型的数组
cout << "i" << endl << (int)i << endl;//i是uchar型,是\0,即空格,无法在doc中显示,所以使用int强制转换。
waitKey(0);
return 0;
}
最后,这种方法访问速度很慢,使用mat.ptr<uchar>(i,j)(单通道) mat,ptr<vec3b>(i,j) (3通道)会快很多