2

データ ファイル (1000 x 5 double) を 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

誰かが何が起こっているのかを理解するのを手伝ってくれますか? どうもありがとうございました!

4

1 に答える 1

1

32F は OpenCV の float を表します。navdata.at<double>(0,4)間違っています。使用するnavdata.at<float>(0,4)か、データ型を 64F に変更する必要があります。また、OpenCV はコードに対して例外をスローする必要があります。そうではなかったと思いますか?

于 2012-07-24T06:16:10.647 に答える