【OpenCV学习记录】6.有关 Mat 构造函数与遍历

1.构造函数
※ cv::Mat(int rows,int cols,int type,int const Scalar&s );指定类型的二维数组,并指定初始化值
例:

cv::Mat m(3, 10, CV_32FC3, cv::Scalar(1.0f, 0.0f, 1.0f));

上述代码表示:构建一个3行7列的图像矩阵,CV_32F是指每个元素的值的类型为32位浮点型,C3表示通道数为3,cv::Scalar(1.0f, 0.0f, 1.0f)表示每个通道的值都为(1,0,1)。

其中Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。定义如下:

typedef struct Scalar{    
	double val[4];
}Scalar;

2.获取数组元素
访问一个元素的两种主要方式是通过位置直接或迭代器访问。
※通过位置直接访问

	cv::Mat m(3, 10, CV_32FC3, cv::Scalar(1.0f, 0.0f, 1.0f));
	cout << m.at<cv::Vec2f>(0, 0)[0] << endl;
	cout << m.at<cv::Vec2f>(0, 0)[1] << endl;
	cout << m.at<cv::Vec3f>(0, 0)[2] << endl;

遇到的问题:
三通道彩色图像指针访问时
不可以这样直接输出

cout <<  src_m.at<Vec3b>(i, j)[0];

要这样:

	int b, g, r;
	b = src_m.at<Vec3b>(i, j)[0];
	g = src_m.at<Vec3b>(i, j)[1];
	r = src_m.at<Vec3b>(i, j)[2];
	cout << "("<< b << ","<< g <<","<< r <<")  ";

※通过迭代器访问

一种迭代器MatConstIterator_

	int sz[3] = { 4,4,4 };
	cv::Mat m(3, sz, CV_32FC3);//三维数组,尺寸为sz(4,4,4),类型为CV_32FC3
	cv::randu(m, -1.0f, 1.0f); //向m中填充-1到1的随机数

	float max = 0.0f;
	//创建只读迭代器,将数组m起始点赋值给it
	cv::MatConstIterator_<cv::Vec3f> it = m.begin<cv::Vec3f>();
	float len2;
	int i = 0; 
	//遍历并比较选出最大值并输出
	while (it != m.end<cv::Vec3f>()) {
		len2 = (*it)[0] * (*it)[0] + (*it)[1] * (*it)[1] + (*it)[2] * (*it)[2];
		cout << len2 << endl;
		if (len2 > max)max = len2;
		it++;
	}
	cout << "max=" << max << endl << "i=" << i << endl;*/

另一种迭代器N_ary(详细定义可参考此处https://blog.csdn.net/gauss_acm/article/details/51195572

//创建另个mat并赋随机值(0~1)
	const int n_mat_size = 5;
	const int n_mat_sz[] = { n_mat_size ,n_mat_size ,n_mat_size };
	cv::Mat n_mat0(3, n_mat_sz, CV_32FC1);
	cv::Mat n_mat1(3, n_mat_sz, CV_32FC1);
	cv::RNG rng;
	rng.fill(n_mat0, cv::RNG::UNIFORM, 0.f, 1.f);
	rng.fill(n_mat1, cv::RNG::UNIFORM, 0.f, 1.f);
//初始化迭代器对象
	const cv::Mat* arrays[] = { &n_mat0, &n_mat1, 0 };
	cv::Mat my_planes[3];
	cv::NAryMatIterator it(arrays, my_planes);
//按面将每个面的所有值相加
	float s = 0.f;
	int n = 0;
	for (int p = 0; p < it.nplanes; p++, ++it) {
		s += cv::sum(it.planes[0])[0];
		s += cv::sum(it.planes[1])[0];
		n++;
	}

3.参考文献
OpenCV学习笔记(3)——Scalar数据类型理解
《学习OpenCV3(中文版)》[美] 安德里安·凯勒、加里·布拉德斯基 著 , 阿丘科技、刘昌祥、吴雨培、王成龙、崔玉芳 等译,清华大学出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值