1

を使用して .txt ファイルから値を取得していますifstream。また、windowsライブラリを使用してフォルダー内のすべてのファイルを読み取ります。つまり、フォルダーの最後に到達するまでループします。このループでは、txt ファイルから値を読み取り、push_back.

問題のコードのセクションは次のとおりです。

Mat trainme(0, dictionarySize, CV_32FC1); 
Mat labels(0, 1, CV_32FC1); //1d matrix with 32fc1 is requirement of normalbayesclassifier class



hTrain = FindFirstFile(full_path, &TrainData);
if (hTrain != INVALID_HANDLE_VALUE)
{

    ifstream file("c:\\222\\labels.txt");
    string line;

    do {

        strcpy(loc,DirSpec);

        Mat img = imread(strcat(loc,TrainData.cFileName), 0);
        cout<<"Processing file:  "<<TrainData.cFileName<<endl;

        if (!img.data){
        cout << "Image data not loaded properly:  " <<TrainData.cFileName<< endl;
        cin.get();
        }
        vector<KeyPoint> keypoints;
        features->detect(img, keypoints);
        if(keypoints.empty()) cout<<"Cannot find keypoints in image:  "<<TrainData.cFileName<<endl;
        Mat bowDescriptor;
        bowDE.compute(img, keypoints, bowDescriptor);
        trainme.push_back(bowDescriptor);
        getline(file, line);

        labels.push_back(line);

        strcpy(loc,"");
        } while( FindNextFile(hTrain,&TrainData));
}

問題は、labels.push_back(line);3 ループ後の行で発生します。ファイルが3回読み取られ、その後エラーが発生したことを意味します: Access violation writing location. で次の行を指しmemcpy.asmます。

    mov     [edi],al        ;U - put byte in destination

なぜ失敗するのかわかりません。stringフォーマットの転送に問題があるのではないかと思ったので使用float value = atof(line)しましたが、文字列フォーマットから変換できず、古いCスタイルの文字列しか取得できないというエラーが発生しました。

これがlabels.txtに含まれるものです

1
2
2
2
1
2
2
2

ご覧いただきありがとうございます。

更新:ファイルの読み取りをメインループから移動して使用しようとしwhile(file.good())ましたが、同じ場所で同じエラーが発生します。理由がわかりません。

string line;
ifstream file("c:\\222\\labels.txt");
if (file.is_open())
{
    while (file.good() )
    {
    getline (file,line);
    labels.push_back(line);
    }
    file.close();
}
4

1 に答える 1

0

よし、なんとか解決した…=/

問題はここにありました:labels.push_back(line);

std::string使っているマットへの追加はできないと思いますpush_back

を使用して文字列を float に変換することで解決しましたatof

getline (file,line);
float label = atof(line.c_str());
labels.push_back(label);
于 2012-12-14T09:08:19.287 に答える