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

how to access floating point value from opencv Mat (other than .at and .ptr)

本文关键字:at ptr 除外 OpenCV Mat 访问      更新时间:2023-10-16
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(

所以你想要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<>相比,这有什么优势呢?

您必须首先将数据(类型无符号字符*指针(指针强制转换为浮点指针:

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

仅当图像是连续的时,此操作才有效。或者投射到:

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

这也适用于 conguos 图像。

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

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