2015-01-23 3 views
0

Я пытаюсь сохранить последовательность элементов Mat в XML-файле. Это эскиз моего кодаOpencv: как написать последовательность Mat в xml с помощью FileStorage

Mat SEQ[3]; 
int nFrame = 0; 
while (1) { 
    ... 
    ... 
    SEQ[nFrame] = dataAt_nFrame; 
    if (nFrame == 2) break; 
    } 

FileStorage fs("test.xml", FileStorage::WRITE); 
fs << "dataSequence" << SEQ; 
fs.release(); 

cvReleaseCapture(&video1); 

FileStorage fs2("test.xml", FileStorage::READ); 
Mat SEQ2[3]; 
fs2["sequence"] >> SEQ2; 

//.... here i want print out the values in order to check if are the same i've written... 
fs2.release(); 

это время (1) анализирует видео, для каждого кадра я получить «dataAt_nFrame», который является Mat. Я хочу сохранить всю последовательность этих данных в массиве SEQ (если вы могли бы предложить альтернативу типа Mat [], который я предпочту), а затем смогут прочитать их и выбрать каждый Мат для каждого номера кадра.

ответ

0

Предлагаю вам использовать байтовые массивы. Here - хороший пример того, как преобразовать cv :: Mat в массив байтов.

0

Вы должны попробовать sequences/unnamed collection для примера, приведенного в примере на link. Однако ниже код не использует его.

#include <string> 

std::string toString(int count) { 
    return "frame"+std::to_string(count); 
} 

int nFrame = 0; 
FileStorage fs("test.xml", FileStorage::WRITE); 
while (1) { 
    //... 
    //... 
    fs << toString(nFrame) << dataAt_nFrame; 
} 

//saving number of frames in file 
fs << "frameCount" << nFrame; 
fs.release(); 

//.... 

int count=0; 
FileStorage fs2("test.xml", FileStorage::READ); 

//reading number of frames from file 
fs2["frameCount"] >> count; 
std::vector<Mat> SEQ2(count); 

while(--count >= 0) { 
    //reading individual Mat 
    fs2[ toString(count) ] >> SEQ2[count]; 
} 

//... 
fs2.release();