【问题标题】:Save opencv descriptor matcher after training with Ferns descriptor在使用 Ferns 描述符进行训练后保存 opencv 描述符匹配器
【发布时间】:2011-12-14 07:48:50
【问题描述】:

我在一个图像识别应用程序中工作,并尝试使用蕨类描述符匹配器实现一个方法。

我使用以下代码训练蕨类结构并保存它们:

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++ 接口执行此操作。这些方法真的有效吗?如果是这样,你们知道如何让它发挥作用吗?

谢谢。

【问题讨论】:

    标签: c++ image-processing opencv image-recognition


    【解决方案1】:

    我想我找到了问题所在。我查看了源文件,实际保存分类器的行被注释掉了。

    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 类在planardetect.cpp 文件中实现了一个write() 方法。我不知道为什么它被注释掉了。我想您可以取消注释该行并重新编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2017-10-19
      • 2018-04-21
      • 2011-11-09
      • 2012-10-16
      • 1970-01-01
      • 2010-10-27
      相关资源
      最近更新 更多