[英]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;
}
筆記
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.