Сохранить сопоставление дескриптора opencv после тренировки с дескриптором Ferns - PullRequest
4 голосов
/ 24 октября 2011

Я работаю в приложении для распознавания изображений и пытаюсь реализовать метод с использованием средства сопоставления дескрипторов Ferns.

Я обучаю структуры Ferns и сохраняю их, используя следующий код:

int main(int argc, char** argv) {


vector<string> trainFilenames;
readTrainFilenames(modelImagesList, imagesDir, trainFilenames);

Ptr<GenericDescriptorMatcher> descriptorMatcher = GenericDescriptorMatcher::create("FERN", params_filename);

SurfFeatureDetector detector(500);
SurfDescriptorExtractor extractor;

vector<vector<KeyPoint> > allKeypoints;
vector<Mat> allTrainImages;

//TRAIN AND SAVE
for(unsigned int i = 0; i < trainFilenames.size(); i++){

    Mat sceneImage;
    std::vector<KeyPoint> sceneKeypoints;

    sceneImage = imread(trainFilenames.at(i), CV_LOAD_IMAGE_GRAYSCALE );

    detector.detect( sceneImage, sceneKeypoints );

    allKeypoints.push_back(sceneKeypoints);
    allTrainImages.push_back(sceneImage);
}

std::string sceneImageData = "sceneImagedatamodel.xml";
FileStorage fs(sceneImageData, FileStorage::WRITE);

descriptorMatcher->add(allTrainImages, allKeypoints);

descriptorMatcher->train(); 
descriptorMatcher->write(fs);

fs.release();   

}

Однако единственное, что я получаю в выходном файле, это:

    <?xml version="1.0"?>
<opencv_storage>
<nclasses>0</nclasses>
<patchSize>31</patchSize>
<signatureSize>2147483647</signatureSize>
<nstructs>50</nstructs>
<structSize>9</structSize>
<nviews>1000</nviews>
<compressionMethod>0</compressionMethod>
</opencv_storage>

Разве я не должен был сохранить всю структуру в файле xml?

Кажется, я не могу найти никого, кто бы делал это с новым интерфейсом C ++.Эти методы действительно работают?Если так, ребята, у вас есть идеи, как заставить его работать?

Спасибо.

1 Ответ

2 голосов
/ 02 декабря 2011

Я думаю, что нашел проблему. Я посмотрел на исходный файл, и строка, которая фактически сохраняет классификатор, закомментирована.

void FernDescriptorMatcher::write( FileStorage& fs ) const
{
    fs << "nclasses" << params.nclasses;
    fs << "patchSize" << params.patchSize;
    fs << "signatureSize" << params.signatureSize;
    fs << "nstructs" << params.nstructs;
    fs << "structSize" << params.structSize;
    fs << "nviews" << params.nviews;
    fs << "compressionMethod" << params.compressionMethod;

//    classifier->write(fs);
}

Вот URL-адрес исходного файла: https://code.ros.org/svn/opencv/trunk/opencv/modules/features2d/src/matchers.cpp

Класс FernClassifier реализует метод write () в файле planardetect.cpp. Я не знаю, почему это закомментировано. Я думаю, вы могли бы раскомментировать строку и перекомпилировать.

...