tis*_*sch 6 c++ opencv image-processing
我见过很多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]
Run Code Online (Sandbox Code Playgroud)
我想知道这是否适用于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];
Run Code Online (Sandbox Code Playgroud)
我的理解是需要一个类型转换来正确访问元素.就像是:
float val = ((float*)matF.data)[ rowIdx * matF.cols + colIdx];
Run Code Online (Sandbox Code Playgroud)
我见过很多不使用类型转换的代码.所以我的问题是:类型转换是否必须访问正确的元素?
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;
}
Run Code Online (Sandbox Code Playgroud)
笔记
| 归档时间: |
|
| 查看次数: |
11273 次 |
| 最近记录: |