2011-07-28 15 views

回答

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(); 

朱利安,

+0

作品這工作得很好。我只需要一個關於fileStorage如何處理循環的例子。謝謝 – Seb

+0

顯然FileStorage不會讓你有數字作爲關鍵。你會得到一個運行時錯誤。 「OpenCV錯誤:錯誤的參數(密鑰必須以字母或_開頭)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密鑰必須以字母開頭。

這是爲了節省Vector<Mat>爲Visual Studio 2010的代碼,我認爲它會爲Vector<KeyPoints>