我想知道是否可以使用CvFileStorage类或cv :: FileStorage类来保存cv :: KeyPoints的向量。读回来也是同样的过程吗?
感谢。
答案 0 :(得分:7)
我不确定你真正的期望: 我给你的代码只是一个例子,展示了文件存储在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();
于连
答案 1 :(得分:7)
char* key;
FileStorage f;
vector<Keypoint> keypoints;
//writing
write(f, key, keypoints);
//reading
read(f[key], keypoints);
答案 2 :(得分: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;
}
}
写一封信,例如&#39; a&#39;作为OPENCV XML格式的编号的前面指定xml KEY必须以字母开头。
这是为Visual Studio 2010保存Vector<Mat>
的代码,我认为它适用于Vector<KeyPoints>