使用mat.at方法获取像素值

我们只要使用的图像多为三通道和单通道。

对于三通道来说,每一个像素的位置内含了三个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通道)会快很多

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值