Как сохранить вектор ключевых точек, используя openCV - PullRequest
8 голосов
/ 29 июля 2011

Мне было интересно, можно ли сохранить вектор cv :: KeyPoints, используя класс CvFileStorage или класс cv :: FileStorage. Также это тот же процесс, чтобы прочитать его обратно?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 10 февраля 2012
char* key;
FileStorage f;
vector<Keypoint> keypoints;

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

//reading
read(f[key], keypoints);
7 голосов
/ 29 июля 2011

Я не уверен в том, что вы действительно ожидаете: код, который я вам предоставляю, является просто примером, показывающим, как работает хранилище файлов в привязках 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();

Julien,

0 голосов
/ 05 декабря 2014
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', напротив нумерации, так как формат XML OPENCV указывает, что ключ xml должен начинаться с буквы.

Это код для сохранения Vector<Mat> для Visual Studio 2010, я думаю, он будет работать для Vector<KeyPoints>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...