2
我试图将数据文件(1000 x 5双)读入Mat对象。 Mat对象初始化为Mat :: zeros(1000,5,CV_32F)。在读取每行数据时,将相应的行分配给新值。代码如下所示:C + + opencv同时为Mat(矩阵)元素赋值,先前赋值的元素已更改
void readNavFile(const char* filename, Mat& navdata) {
ifstream infile(filename);
string line;
int x=0, y=0;
if (infile.is_open()) {
while (getline(infile, line)) {
double value;
stringstream converter(&line[0]);
double* p = navdata.ptr<double>(x);
while (converter >> value) {
p[y++] = value;
//DEBUGING
cout << "Pointer value:" << p[y-1] << endl;
cout << "Matrix value at:" << "row:" << x << " col:" << y-1 <<" is: "<< navdata.at<double>(x,y-1)<< endl;
cout << navdata.at<double>(0,4) << endl;
}
y = 0;
x++;
}
infile.close();
//DEBUGING
cout << "Final matrix first row, last element:" << navdata.at<double>(0,4) << endl;
}
}
正如你所看到的,我试着打印出垫(矩阵)元素的值,因为它们进行分配,这样我可以肯定的是正确的值存储。奇怪的是,这项任务都进行得很顺利,但是之前分配的一些元素会让所有突变者改变它们的价值。样品的输出看起来象以下,在最后一行,分配元件[1,2],在[0,4]从它的正确值18.1901改为3.31757e-190后的值:
Pointer value:-35.1236
Matrix value at:row:0 col:0 is: -35.1236
Matrix element [0,4]: 0
Pointer value:150.735
Matrix value at:row:0 col:1 is: 150.735
Matrix element [0,4]: 0
Pointer value:360.094
Matrix value at:row:0 col:2 is: 360.094
Matrix element [0,4]: 0
Pointer value:3.46045
Matrix value at:row:0 col:3 is: 3.46045
Matrix element [0,4]: 0
Pointer value:18.1901
Matrix value at:row:0 col:4 is: 18.1901
Matrix element [0,4]: 18.1901
Pointer value:-35.1236
Matrix value at:row:1 col:0 is: -35.1236
Matrix element [0,4]: 18.1901
Pointer value:150.735
Matrix value at:row:1 col:1 is: 150.735
Matrix element [0,4]: 18.1901
Pointer value:360.096
Matrix value at:row:1 col:2 is: 360.096
Matrix element [0,4]: 3.31757e-190
莫非有人帮我弄清楚发生了什么事?非常感谢你!
一个疯狂的猜测,因为我不知道库,但'CV_32F'碰巧意味着“32位浮点”?而'double'碰巧有64位? – 2012-07-24 01:22:53
是的,就是这样。我最初有浮动,然后我想我可能需要额外的精度,所以改变了一倍,但忘了改变mat init!谢谢! – Silmarilli 2012-07-24 01:35:57