Я хочу выполнить очень простую задачу, но не могу из-за ошибки, которую не могу понять. Я хочу сохранить содержимое обнаруженных объектов в вектор в текстовый файл, используя следующий фрагмент кода
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;
}
Но мне преподносят следующую ошибку:
станд :: вектор<_Ty> :: at ‘: вызов функции отсутствует в списке аргументов; использование
‘&станд :: вектор<_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 — матрица, состоящая из типа данных с плавающей точкой
Попробуйте изменить код ниже:
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;
}
Сказать: outf << "value at "<< i << " = " << keypoints[i] <<endl;
Используя встроенный класс FileStorage, это было так же просто, как добавить две строки. Я напечатал вектор KeyPoints, используя следующие строки:
FileStorage fs("test.xml", FileStorage::WRITE);
fs << "meh" << keypoints;