2

非常に単純なタスクを実行したいのですが、エラーのために理解できません。次のコードを使用して、検出された機能の内容をベクターに保存してtxtファイルに保存したい

Ptr<FeatureDetector> feature_detector = FeatureDetector::create("SIFT");
vector<KeyPoint> keypoints;

feature_detector->detect(img, keypoints);

for(unsigned int i = 0; i < keypoints.size(); i++)
{
    ofstream outf("vector.txt", ios::app);
    outf<<"value at "<< i << " = " << keypoints.at<KeyPoint>(i)<<endl;
}

しかし、次のエラーが表示されます。

std :: vector <_Ty> :: at':関数呼び出しに引数リストがありません。'&std :: vector <_Ty> :: at'を使用して、メンバーへのポインターを作成します

構文を確認しましたが、何も問題が見つかりませんでした。

編集:これの前に、私はマトリックスの内容を印刷したいと思っていました、そしてこのフォーマットはそれのために完全に働きました、これは私がマトリックスの内容を印刷するために使用したコードです:

for(int x = 0;x < dst.rows ; x++)
{
    for( int y = 0; y < dst.cols; y++)
    {
        ofstream outf("Sample.txt", ios::app);
        outf<<"value at "<< x << "  " << y << " = " << dst.at<float>(x,y)<<endl;
    }
}

ここで、dstはfloatデータ型で構成される行列です。

4

3 に答える 3

2

コードを以下に変更してみてください。

 ofstream outf("vector.txt", ios::app);  // you don't want to open file again and again
 for(unsigned int i = 0; i < keypoints.size(); i++)
 {
     outf<<"value at "<< i << " = " << keypoints.at(i)<<endl;
 }
 outf.close(); 

@jogojapanが述べたように、OpenCV KeyPointのオーバーロード演算子<<(..)。

std::ostream& operator<<(std::ostream& out,const KeyPoint& keypoint)
{
  // add stream keypoint member by yourself here
  out << keypoint.size;
  out << keypoint.angle;
  out << keypoint.response;
  out << keypoint.octave;
  out << keypoint.class_id;
  return out;
}
于 2012-11-07T01:59:16.447 に答える
1

言う:outf << "value at "<< i << " = " << keypoints[i] <<endl;

于 2012-11-07T01:07:04.023 に答える
0

組み込みの FileStorage クラスを使用すると、2 行を追加するだけで簡単に実行できます。次の行を使用して KeyPoints のベクトルを出力しました。

FileStorage fs("test.xml", FileStorage::WRITE);

    fs << "meh" << keypoints;
于 2012-11-11T16:22:08.970 に答える