【问题标题】:C++ opencv while assigning value to Mat (matrix) element, the previously assigned element changedC ++ opencv在为Mat(矩阵)元素赋值时,先前分配的元素发生了变化
【发布时间】:2012-07-22 06:22:38
【问题描述】:

我正在尝试将数据文件 (1000 x 5 doubles) 读入 Mat 对象。 Mat 对象被初始化为 Mat::zeros(1000,5,CV_32F)。在读取每一行数据时,将相应的行分配给新值。代码如下:

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;
    }
}

如您所见,我尝试在分配 Mat(矩阵)元素时打印出它们的值,以便确保存储了正确的值。奇怪的是分配一切都很顺利,但是之前分配的一些元素会突然改变它们的值。示例输出如下所示,在最后一行,分配元素 [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 位?
  • 是的,就是这样。我最初有浮动,然后我想我可能需要额外的精度,所以改为双倍但忘记更改 Mat init!谢谢!

标签: c++ opencv


【解决方案1】:

32F 代表 OpenCV 中的浮点数。 navdata.at&lt;double&gt;(0,4) 不正确。您应该使用navdata.at&lt;float&gt;(0,4)或者,将您的数据类型更改为 64F。此外,OpenCV 应该为您的代码抛出异常。你确定不是吗?

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多