04_OpenCv之访问多通道Mat对象中的值

04_OpenCv之访问多通道Mat对象中的值

一.利用成员函数at

利用成员函数at访问多通道Mat的元素值,可以将多通道Mat看作一个特殊的二维数组,只是在每一个位置上不是一个数值,而是一个向量.

for(int r=0; r<m.rows; r++) {
    for(int c=0; c<m.cols; c++) {
        cout << m.at<Vec3f>(r, c) << ",";
    }
    cout << endl;
}

打印结果如下:

[1,11,21],[2,12,22],
[3,13,23],[4,14,24]

二.利用成员函数ptr

多通道Mat的数值在内存中也是按行存储的,且每一行存储在连续的内存区域中,成员ptr可以返回指向指定行的第一个元素的指针.

在这里插入图片描述

for(int r=0; r<m.rows; r++) {
    //获取每行第一个元素的地址
    Vec3f* ptr = m.ptr<Vec3f>(r);
    for(int c=0; c<m.cols; c++) {
        cout << ptr[c] << ",";
    }
    cout << endl;
}

打印结果:

[1,11,21],[2,12,22],
[3,13,23],[4,14,24]

三.利用成员函数isContinuous和ptr

与单通道Mat对象类似,通过isContinuous判断整个Mat对象中的元素值是否存储在连续的内存区域中,如果返回值是true,即表示是连续存储的.

在这里插入图片描述

如果isContinuous返回true,则使用ptr访问Mat中的值可以减少一个for循环,只通过一个for循环就可以得到每一个元素的值

if(m.isContinuous()) {
    //指向多通道矩阵第一个元素的指针
    Vec3f* ptr = m.ptr<Vec3f>(0);
    for(int n=0; n<m.rows*m.cols; n++) {
        cout << ptr[n] << endl;
    }
}

如果只获取第r行c列的元素值,可以通过ptr[r*rows + c*cols]得到

四.利用成员变量data和step

与单通道Mat类似,也可以通过data和step获取多通道Mat的每一个元素,step[0]代表每一行所占的字节数,如果行与行之间有间隔,则step[0]的值包含这个间隔数,step[1]代表每一个元素所占的字节数,step[1]和elemSize()返回值是相等的,而elemSize1()代表一个元素中一个数值所占的字节数,所以step[1]=elemSize1()*channels(),data表示矩阵中首个数值的地址。

在这里插入图片描述

for(int r=0; r<m.rows(); r++) {
    for(int c=0; c<m.cols(); c++) {
        //得到指向每一个元素的指针
        Vec3f* ptr = (Vec3f*) (m.data + r*m.step[0] + c*m.step[1])
        cout << *ptr << ",";
    }
    cout << endl;
}
发布了79 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gzx110304/article/details/89663021
今日推荐