我见过很多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];
我见过很多不使用类型转换的代码.所以我的问题是:类型转换是否必须访问正确的元素?
Mat
数据是一个uchar*
.如果你有一个浮动矩阵CV_32FC1
,你需要访问数据float
.
你可以用不同的方式做,不一定使用cast:
#includeusing 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
通过指针访问,因为图像可能不是连续的.点击此处了解更多详情.
该片段改编自我的另一个答案