gpt4 book ai didi

c++ - OpenCV Mat 数据成员访问

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:42 31 4
gpt4 key购买 nike

我看过很多直接访问cv::Mat 数据成员的OpenCV 代码。 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 charcv::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 的形式访问数据。

你可以用不同的方式来做,不一定要使用转换:

#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,因为图像可能不是连续的。检查here了解更多详情。
  • 该片段改编自此 my other answer

关于c++ - OpenCV Mat 数据成员访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34042112/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com