2011-07-28 66 views

Trả lời

7

Tôi không chắc chắn về những gì bạn thực sự mong đợi: Mã tôi cung cấp cho bạn chỉ đơn giản là một ví dụ, để hiển thị cách lưu trữ tệp hoạt động trong các ràng buộc OpenCV C++. Nó giả định ở đây rằng bạn viết vào tệp XML tất cả các Keypoints một cách riêng biệt, với tên của chúng là vị trí của chúng trong vectơ mà chúng được lưu trữ trong.

Nó giả định rằng khi bạn đọc chúng trở lại, bạn biết số của chúng muốn đọc, nếu không, mã sẽ phức tạp hơn một chút. Bạn sẽ tìm thấy một cách (ví dụ bạn đọc filestorage và kiểm tra những gì nó cung cấp cho bạn, nếu nó không cung cấp cho bạn bất cứ điều gì, sau đó nó có nghĩa là không có nhiều điểm để đọc) -Nó chỉ là một ý tưởng, bạn phải tìm một giải pháp, có lẽ đoạn mã này sẽ đủ cho bạn. Tôi nên chính xác rằng tôi sử dụng ostringstream để đặt các số nguyên trong chuỗi và bằng cách thay đổi nơi mà nó sẽ được ghi trong tập tin * .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(); 

Julien,

+0

này hoạt động độc đáo. Tôi chỉ cần một ví dụ thực sự về cách xử lý các vòng lặp fileStorage. Cảm ơn – Seb

+0

Rõ ràng FileStorage sẽ không cho phép bạn có số làm khóa. Bạn sẽ gặp lỗi thời gian chạy. "Lỗi OpenCV: Đối số không hợp lệ (Khóa phải bắt đầu bằng một chữ cái hoặc _) trong icvYMLWrite" Phải thêm '_' trước chuỗi số. – 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; 
} 
} 

Đặt thư ví dụ như 'a' trước mặt của việc đánh số như các định dạng XML OpenCV xác định KEY xml phải bắt đầu bằng chữ cái.

Đây là một mã số để tiết kiệm Vector<Mat> cho visual studio 2010, tôi nghĩ rằng nó sẽ làm việc cho Vector<KeyPoints>

Các vấn đề liên quan