簡體   English   中英

OpenCV Mat數據成員訪問

[英]OpenCV Mat data member access

我已經看到很多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]

我想知道這是否適用於具有除unsigned char之外的像素類型的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];

我見過很多不使用類型轉換的代碼。 所以我的問題是:類型轉換是否必須訪問正確的元素?

Mat數據是uchar* 如果你有一個,比如說,浮點數矩陣CV_32FC1 ,您需要訪問數據為float

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

#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;
}

筆記

  • 當通過指針直接訪問data時,最好使用step1()而不是cols ,因為圖像可能不是連續的。 點擊此處了解更多詳情。
  • 該片段改編自我的另一個答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM