C++ OpenCV Mat数据成员访问

C++ OpenCV Mat数据成员访问,c++,opencv,image-processing,C++,Opencv,Image Processing,我见过很多OpenCV代码,它们直接访问cv::Mat的数据成员cv::Mat将指向数据的指针存储在unsigned char*data成员中。对数据成员的访问权限如下所示: cv::Mat matUC(3,3,CV_8U) int rowIdx = 1; int colIdx = 1; unsigned char val = matUC.data[ rowIdx * matUC.cols + colIdx] 我想知道这是否适用于像素类型不是无符号字符的cv::Mat cv::Mat mat

我见过很多OpenCV代码,它们直接访问
cv::Mat
的数据成员
cv::Mat
将指向数据的指针存储在
unsigned char*data
成员中。对数据成员的访问权限如下所示:

cv::Mat matUC(3,3,CV_8U)
int rowIdx = 1;
int colIdx = 1;

unsigned char val = matUC.data[ rowIdx * matUC.cols + colIdx]
我想知道这是否适用于像素类型不是
无符号字符的
cv::Mat

cv::Mat matF(3,3,CV_32F)
int rowIdx = 1;
int colIdx = 1;

float val = matF.data[ rowIdx * matF.cols + colIdx];
我的理解是需要类型转换来正确访问元素。比如:

float val = ((float*)matF.data)[ rowIdx * matF.cols + colIdx];

我见过很多不使用类型转换的代码。所以我的问题是:typecast必须访问正确的元素吗?

Mat
数据是一个
uchar*
。如果您有一个浮点矩阵
CV_32FC1
,则需要以
float
的形式访问数据

您可以采用不同的方式,但不一定使用铸造:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    cv::Mat matF(3, 3, CV_32F);
    randu(matF, Scalar(0), Scalar(10));

    int rowIdx = 1;
    int colIdx = 1;

    // 1
    float f1 = matF.at<float>(rowIdx, colIdx);

    // 2
    float* fData2 = (float*)matF.data;
    float f2 = fData2[rowIdx*matF.step1() + colIdx];

    // 3
    float* fData3 = matF.ptr<float>(0);
    float f3 = fData3[rowIdx*matF.step1() + colIdx];

    // 4
    float* fData4 = matF.ptr<float>(rowIdx);
    float f4 = fData4[colIdx];

    // 5
    Mat1f mm(matF); // Or directly create like: Mat1f mm(3, 3);
    float f5 = mm(rowIdx, colIdx);

    // f1 == f2 == f3 == f4 == f5

    return 0;
}
#包括
使用名称空间cv;
int main()
{
cv::Mat matF(3,3,cv_32F);
randu(matF,标量(0),标量(10));
int rowIdx=1;
int colIdx=1;
// 1
浮点数f1=材料温度(rowIdx,colIdx);
// 2
浮点*fData2=(浮点*)matF.data;
浮点f2=fData2[rowIdx*matF.step1()+colIdx];
// 3
浮点*fData3=matF.ptr(0);
float f3=fData3[rowIdx*matF.step1()+colIdx];
// 4
float*fData4=matF.ptr(rowIdx);
浮点数f4=fData4[colIdx];
// 5
Mat1f-mm(matF);//或直接创建类似:Mat1f-mm(3,3);
浮动f5=mm(rowIdx,colIdx);
//f1==f2==f3==f4==f5
返回0;
}
注释

  • 通过指针直接访问
    数据时,最好使用
    step1()
    而不是
    cols
    ,因为图像可能不是连续的。查看更多详细信息
  • 该片段改编自此

Try:
float val=matF.at(rowIdx,colIdx)
注意
数据[row*cols+col]
仅在矩阵
连续()时有效。如果您没有这些信息,最安全的方法是执行
matrix.ptr(row)[col]
。这样创建的Mat
cv::matF(3,3,cv32f)
始终保证是连续的吗?是的,请查看更多详细信息。@tisch这是否回答了您的问题?或者你需要别的什么?请让我知道。这完全回答了我的问题。谢谢你的努力@蒂希很高兴这有帮助:D