如何使用openCV保存关键点向量

如何使用openCV保存关键点向量,c,file-io,opencv,C,File Io,Opencv,我想知道是否可以使用CvFileStorage类或cv::FileStorage类保存cv::KeyPoints的向量。同样的过程是读回吗 谢谢。我不确定您真正的期望是什么: 我提供的代码只是一个例子,它展示了文件存储在OpenCV C++绑定中的工作原理。这里假设您分别在XML文件中写入所有关键点,它们的名称是它们在存储在其中的向量中的位置 它还假设,当您读回它们时,您知道要读取的数量,如果不知道,代码就稍微复杂一点。您将找到一种方法(例如,如果您阅读文件存储并测试它提供给您的内容,如果它没有

我想知道是否可以使用CvFileStorage类或cv::FileStorage类保存cv::KeyPoints的向量。同样的过程是读回吗


谢谢。

我不确定您真正的期望是什么: 我提供的代码只是一个例子,它展示了文件存储在OpenCV C++绑定中的工作原理。这里假设您分别在XML文件中写入所有关键点,它们的名称是它们在存储在其中的向量中的位置

它还假设,当您读回它们时,您知道要读取的数量,如果不知道,代码就稍微复杂一点。您将找到一种方法(例如,如果您阅读文件存储并测试它提供给您的内容,如果它没有提供任何内容,那么这意味着没有更多的阅读点)-这只是一个想法,您必须找到一个解决方案,也许这段代码对您来说就足够了。 我应该明确地指出,我使用ostringstream将整数放入字符串中,并顺便更改它将写入*.yml文件的位置

//TO WRITE
vector<Keypoint> myKpVec;
FileStorage fs(filename,FileStorage::WRITE);

ostringstream oss;
for(size_t i;i<myKpVec.size();++i) {
    oss << i;
    fs << oss.str() << myKpVec[i];
}
  fs.release();

//TO READ
vector<Keypoint> myKpVec;
FileStorage fs(filename,FileStorage::READ);
ostringstream oss;
Keypoint aKeypoint;
for(size_t i;i<myKpVec.size();<++i) {
    oss << i;
    fs[oss.str()] >> aKeypoint;
    myKpVec.push_back(aKeypoint);
}
fs.release();
//如何编写
载体myKpVec;
FileStorage fs(文件名,FileStorage::WRITE);
ostringstream oss;
用于(大小i;i
char*键;
文件存储f;
矢量关键点;
//书写
写(f,关键点,关键点);
//阅读
读取(f[关键点]、关键点);
int main(){
字符串filename=“data.xml”;
FileStorage fs(文件名,FileStorage::WRITE);
向量向量矩阵;
mata(3,3,CV_32F,标量(5));
Mat B(3,3,CV_32F,标量(6));
matc(3,3,CV_32F,标量(7));
矢量推回(A);
矢量推回(B);
矢量推回(C);
//ostringstream oss;

对于(int i=0;它工作得很好。我只需要一个文件存储如何处理循环的示例。感谢文件存储不允许将数字作为键。您将得到一个运行时错误。“OpenCV错误:icvYMLWrite中的错误参数(键必须以字母开头)必须在数字字符串前面添加“”。
char* key;
FileStorage f;
vector<Keypoint> keypoints;

//writing 
write(f, key, keypoints);

//reading
read(f[key], keypoints);
int main() {
String filename = "data.xml";
FileStorage fs(filename,FileStorage::WRITE);
Vector<Mat> vecMat;
Mat A(3,3,CV_32F, Scalar(5));
Mat B(3,3,CV_32F, Scalar(6));
Mat C(3,3,CV_32F, Scalar(7));
vecMat.push_back(A);
vecMat.push_back(B);
vecMat.push_back(C);
//ostringstream oss;
for(int i = 0;i<vecMat.size();i++) {
    stringstream ss;
    ss << i;
    string str = "x" + ss.str();        
    fs << str << vecMat[i];
}
fs.release();
vector<Mat> matVecRead;
FileStorage fr(filename,FileStorage::READ);
Mat aMat;   
int countlabel = 0;
while(1) {
    stringstream ss;
    ss << countlabel;
    string str = "x" + ss.str();
    cout << str << endl;
    fr[str] >> aMat;
    if (fr[str].isNone() == 1) {
        break;
    }
    matVecRead.push_back(aMat.clone());     
    countlabel ++;
}
fr.release();
for( unsigned j = 0; j < matVecRead.size(); j++){   
    cout << matVecRead[j] << endl;  
}
}