如何从opencv Mat(除.at和.ptr之外)访问浮点值

时间:2013-12-10 10:48:39

标签: c++ opencv

float data = matrixm.ptr<float>(i)[j]; - working
float data = matrixm.at<float>(i,j); - working
float data = matrixm.data[i*matrixm.step+j*matrix.elemSize()] - is not giving correct output

如何在不使用模板的情况下直接访问浮点数据(.at.ptr

3 个答案:

答案 0 :(得分:0)

你必须先将数据(类型unsigned char * pointer)指向float指针:

float data = ((float*)matrixm.data)[j+i*matrixm.cols];

仅当图像是连续的时才有效。或者在之后施放:

float data = (float)(matrix.data[i*matrixm.step[0]+j*matrix.elemSize()]])

这也适用于conguos图像。

对我而言,它看起来不像XY问题。看起来你是OpenCV世界的新手,你想了解它是如何工作的。

答案 1 :(得分:0)

所以你想要at<>的功能而不使用它? 以下是at<>的有趣src行:

template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
    ...
    return ((_Tp*)(data + step.p[0]*i0))[i1];

所以你应该:

float data = ((float*)(matrixm.data + matrixm.step.p[0]*i))[j];  

但是,与调用at<>

相比,这有什么优势?

答案 2 :(得分:0)

ptr应该是最好的方法(具有良好的性能); OpenCV不保证Mat会在ram上保持连续范围,对于足够大的图像,它可以按行划分,并保存在不同的位置。因此,您需要使用ptr来获取一行的位置。