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(中文版)》[美] 安德里安·凯勒、加里·布拉德斯基 著 , 阿丘科技、刘昌祥、吴雨培、王成龙、崔玉芳 等译,清华大学出版社