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\(1)[2]来访问

通过迭代器访问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<>()
通过“++”来实现指针位置向下迭代

results matching ""

    No results matching ""