C++ 如何从opencv Mat访问浮点值(除了.at和.ptr) float data=matrixm.ptr(i)[j];-工作 float data=matrixm.at(i,j);-工作 float data=matrixm.data[i*matrixm.step+j*matrix.elemSize()]未给出正确的输出

C++ 如何从opencv Mat访问浮点值(除了.at和.ptr) float data=matrixm.ptr(i)[j];-工作 float data=matrixm.at(i,j);-工作 float data=matrixm.data[i*matrixm.step+j*matrix.elemSize()]未给出正确的输出,c++,opencv,C++,Opencv,如何在不使用模板的情况下直接访问浮点数据(.at,.ptr)您必须首先将数据(键入unsigned char*pointer)指针强制转换为浮点指针: 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

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

您必须首先将数据(键入unsigned char*pointer)指针强制转换为浮点指针:

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
这仅在图像连续时有效。或在以下情况下投下:

float data = ((float*)matrixm.data)[j+i*matrixm.cols];
这也适用于conguos图像


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

那么你想在不使用它的情况下使用
at
的功能吗? 下面是在上的的有趣的src行:


但是这比在处调用
有什么优势呢?

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

这听起来像是一个错误。你想解决什么问题?为什么要避免
at
ptr
。我不明白为什么
ptr
会有问题,特别是如果您知道图像是连续的(在这种情况下,您只调用它一次)。
float data = (float)(matrix.data[i*matrixm.step[0]+j*matrix.elemSize()]])
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];