【发布时间】:2020-04-23 17:25:38
【问题描述】:
我正在尝试在 OpenCV 中使用 3D 矩阵来存储和访问数据(浮点类型)。目前我有 3 种方法来创建大小为 158 x 98 x 32 的 3D 矩阵本身并将其初始化为零:
int out[3];
out[0] = 98;
out[1] = 158;
out[2] = 32;
//Alternative 1:
cv::Mat M(3, out, CV_32FC1, cv::Scalar(0));
//Alternative 2:
cv::Mat M(3, out, CV_32F);
M = Scalar(0);
//Alternative 3:
Mat *feat = new Mat(3,out,CV_32F,Scalar(0));
Mat M = *feat;
然后我使用 .data 函数获取指向第一个数据元素的指针:
unsigned char *input = (unsigned char*)(M.data);
接下来,我想我可以使用以下两种方法之一将第一个元素 (0,0,0) 设置为 1:
input[0]= 1; //Alternative 1
M.at<float>(0,0,0) = 1; //Alternative 2
at() 方法工作得很好,但我似乎无法让指针工作。以下:
input[0]= 1;
input[1]= 2;
在元素 (0,0,0) 处导致 4.32e-42,而其他命令似乎根本没有效果。根据文档,input[0] 应该指点 (0,0,0) 处的值,input[1] 到 (0,0,1) 和 input[32] 到 (0,1,0) 等.
此外,M.step 设置为 0,M.cols 和 M.rows 均为 -1。多维矩阵的行数和列数似乎是对的,但是 step 应该有值,对吧?
那么,这 3 种备选方案中的哪一种最适合初始化 3D 矩阵,如何使用指针分别访问每个数据元素?
顺便说一句,我正在使用以下代码来输出矩阵的内容(也欢迎任何其他想法):
float M_res = 0;
ofstream res;
res.open("Results.txt"); //Open file
for(int loopz=0;loopz<out[2];loopz++) {
res << endl << endl << "Dimension " << loopz << endl;
for(int loopy=0;loopy<out[0];loopy++) {
res << endl;
for(int loopx=0;loopx<out[1];loopx++) {
M_res = M.at<float>(loopy,loopx,loopz)
res << M_res << " ";
}
}
}
【问题讨论】:
-
对此有什么想法吗?非常欢迎所有想法!
-
这行好像是错误的:然后我使用.data函数获取指向第一个数据元素的指针:unsigned char input = (unsigned char)(M 。数据);由于矩阵 M 类型是浮点数,因此您应该使用 float *input = (float *)(M.data);