02_OpenCv之访问单通道Mat对象中的值
一.利用成员函数at
对于单通道且数据类型为CV_32F的Mat对象,以:
为例,可通过如下方式访问第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]))