当前位置:  开发笔记 > 编程语言 > 正文

OpenCV Mat数据成员访问

如何解决《OpenCVMat数据成员访问》经验,为你挑选了1个好方法。

我见过很多OpenCV代码cv::Mat直接访问a的数据成员.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像素类型以外的其他类型unsigned char.

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];

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



1> Miki..:

Mat数据是一个uchar*.如果你有一个浮动矩阵CV_32FC1,你需要访问数据float.

你可以用不同的方式做,不一定使用cast:

#include 
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(rowIdx, colIdx);

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

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

    // 4
    float* fData4 = matF.ptr(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;
}

笔记

最好使用step1()而不是cols直接data通过指针访问,因为图像可能不是连续的.点击此处了解更多详情.

该片段改编自我的另一个答案

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有