02_OpenCv之访问单通道Mat对象中的值

02_OpenCv之访问单通道Mat对象中的值

一.利用成员函数at

对于单通道且数据类型为CV_32F的Mat对象,以:
m = [ 11 12 33 43 51 16 ] m= \left[ \begin{matrix} 11 & 12\\ 33 & 43\\ 51 & 16 \end{matrix} \right]
为例,可通过如下方式访问第r行c列的像素值:

//r,c分别代表行数和列数
float pixel = m.at<float>(r, c);

//c,r分别代表横坐标x和纵坐标y
float pixel = m.at<float>(Point(c,r)); 

二.利用成员函数ptr

通过成员函数ptr获得指向每一行首地址的指针,假设m的行与行之间是有间隔的,则m中所有的值在内存中的存储方式如下:

在这里插入图片描述

可通过如下方式访问矩阵m中的值:

for(int r=0; r<m.rows; r++) {
    const int* ptr = m.ptr<int>(r);
    for(int c=0; c<m.cols; c++) {
        cout << ptr[c] << ",";
    }
    cout << endl;
} 

三.利用成员变量isContinuous和ptr

如果isContinuous返回true,则代表行与行之间也是连续存储的,即m中所有的值都是连续存储的,如下所示:

在这里插入图片描述

可通过如下方式访问矩阵m中的值:

if(m.isContinuous()) {
    //得到矩阵m的第一个值的地址
    int* ptr = m.ptr<int>(0);
    for(int n=0; n<m.rows*m.cols; n++) {
        cout << ptr[n] << ",";
    }
    cout << endl;
}

四.利用成员变量step和data

对于单通道矩阵来说,step[0]代表每一行所占的字节数,而如果m的行与行之间如果有间隔的话,这个间隔也作为字节数的一部分被计算在内;step[1]代表每一个数值所占的字节数,data是指向第一个数值的指针,类型为uchar,如下所示:

在这里插入图片描述


在这里插入图片描述

所以,无论单通道矩阵m的行与行之间是否有间隔,都可以通过以下代码实现:

float pixel = *((float*) (m.data + m.step[0]*r + c*m.step[1]))
发布了79 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

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