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

8
我在想是否可以使用CvFileStorage类或cv :: FileStorage类保存cv :: KeyPoints的向量。读取时是否需要相同的过程?
谢谢。
3个回答

7
我不确定您的期望是什么: 我提供给您的代码只是一个示例,展示了OpenCV C++绑定中文件存储的工作原理。它假设您将所有Keypoints单独写入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();

朱利安,


这个很好用。我只是需要一个fileStorage如何处理循环的例子。谢谢。 - Seb
显然,FileStorage 不允许您将数字作为键。您会收到运行时错误。"OpenCV Error: Bad argument (Key must start with a letter or ) in icvYMLWrite" 必须在数字字符串前面添加 ''。 - DXM

7
char* key;
FileStorage f;
vector<Keypoint> keypoints;

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

//reading
read(f[key], keypoints);

0
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;  
}
}

在数字前加上一个字母,例如'a',因为OPENCV XML格式规定xml KEY必须以字母开头。
这是一个保存Vector<Mat>的代码,适用于Visual Studio 2010,我认为它也适用于Vector<KeyPoints>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接