2011-10-24 136 views
4

我正在使用圖像識別應用程序並試圖使用Ferns描述符匹配器來實現一種方法。使用Ferns描述符保存opencv描述符匹配器

我訓練蕨類植物的結構和使用下面的代碼保存它們:

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++接口做這件事的地方。這些方法真的有用嗎?如果是這樣,你們有沒有想法如何使它起作用?

謝謝。

回答

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

這裏是URL到源文件:https://code.ros.org/svn/opencv/trunk/opencv/modules/features2d/src/matchers.cpp

的FernClassifier類實現在planardetect.cpp文件的寫()方法。我不知道它爲什麼被註釋掉。我想你可以取消註釋並重新編譯。