使用Ferns描述符训练后保存opencv描述符匹配器

时间:2011-10-24 17:20:02

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

我正在使用图像识别应用程序并尝试使用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 个答案:

答案 0 :(得分:2)

我想我发现了这个问题。我查看了源文件,实际保存分类器的行被注释掉了。

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);
}

以下是源文件的网址:https://code.ros.org/svn/opencv/trunk/opencv/modules/features2d/src/matchers.cpp

FernClassifier类在planardetect.cpp文件中实现了write()方法。我不知道为什么会被评论出来。我想你可以取消注释该行并重新编译。