我正在使用图像识别应用程序并尝试使用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 ++接口执行此操作的人。这些方法真的有效吗?如果是这样,你们有没有想过如何让它发挥作用?
谢谢。
答案 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()方法。我不知道为什么会被评论出来。我想你可以取消注释该行并重新编译。