Mat类元素的读取
| 属性 | 作用 |
|---|---|
| cols | 矩阵的列数 |
| rows | 矩阵的行数 |
| step | 以字节为单位的矩阵的有效宽度 |
| elemSize() | 每个元素的字节数 |
| total() | 矩阵中元素的个数 |
| channels() | 矩阵的通道数 |
例如:Mat(3,4,CV_32FC3)
列数cols = 4 行数rows = 3 通道数channels() = 3
每一个元素字节数elemSzie() = 32/8 * channels = 12
以字节为单位的矩阵的有效宽度step = elemSize() * clos = 48
at方法读取Mat类单通道矩阵
示例:
Mat a = (Mat_<uchar>(3,3) << 1,2,3,4,5,6,7,8,9 );
int Value = (int)a.at<uchar>(0,0);
at方法需要跟上<数据类型>,如果矩阵定义的是uchar类型数据,那么需要强制转换为int类型输出
at方法读取Mat类多通道矩阵元素
示例:
Mat a = (Mat_<uchar>(3,3) << 1,2,3,4,5,6,7,8,9 );
int Value = (int)a.at<uchar>(0,0);
at方法需要跟上<数据类型>,如果矩阵定义的是uchar类型数据,那么需要强制转换为int类型输出
1.4.2 at方法读取Mat类多通道矩阵元素
OpenCV中,针对3通道矩阵,定义了Vec3b、Vec3s、Vec3w、Vec3d、Vec3f、Vec3i共6种类型
数字表示通道个数,最后一位为数据类型缩写
b-uchar s-short w-ushort d-double f-float i-int
二通道和四通道与三通道规则相同,例如:Vec2b、Vec4b
示例:
Mat b (3,4,CV_8UC3,Scalar(0,0,1));
Vec3b vc3 = b.at<Vec3b>(3,3);
int first = (int)vc3.val[0];
int second = (int)vc3.val[2];
int third = (int)vc3.val[3];
注意at方法中数据变量类型与矩阵的数据变量类型相同
Vec3b类型输入每一个通道是要强制类型转换
通过指针读取Mat类矩阵中元素
示例:
Mat b (3,4,CV_8UC3,Scalar(0,0,1));
for (int i = 0; i < b.rows; i++)
{
uchar* ptr = b.ptr<uchar>(i);
for (int j = 0; j < b.cols*b.channels(); j++)
{
cout << (int)ptr[j] <<endl;
}
}
定义一个uchar类型的指针ptr,用()来声明指针指向Mat类矩阵的哪一行
clos*channels()来计算有多少位数,判断指针需要向后移动多少
例如:读取第2行第3个数据,用a.ptr\
通过迭代器访问Mat类矩阵中的元素
示例:
MatIterator_uchar it = a.begin<uchar>();
MatIterator_uchar it_end = a.end<uchar>();
for (int i = 0; it != it_end; it++)
{
cout << (int)(*it) << " ";
if ((++i% a.cols) == 0) //判断是否到矩阵尾
{
cout << endl;
}
}
数据读取方法是先读取第一个元素的每一个通道,再读取第二个元素的每一个通道
Mat迭代器用法:
Mat类的迭代器变量类型为: MatItertor_<>
Mat类的迭代器起始: Mat.begin<>()
Mat类的迭代器结束: Mat.end<>()
通过“++”来实现指针位置向下迭代