我在論壇或郵件列表上沒有看到這個答案。我不得不深入研究OpenCV源代碼(2.4.5),看看如何完成這個任務。它要求子類獲取FlannBasedMatcher的受保護成員。
關鍵是將算法設置爲FLANN_INDEX_SAVED
和indexParams
上的文件名。
另外值得注意的是:
接下來要做的就是壓縮指數(用gzip),也可以是3-4倍,而成本來解壓縮是比較低的。這必須是OpenCV中的一個補丁。
class SaveableMatcher : public cv::FlannBasedMatcher
{
public:
SaveableMatcher()
{
}
virtual ~SaveableMatcher()
{
}
void printParams()
{
printf("SaveableMatcher::printParams: \n\t"
"addedDescCount=%d\n\t"
"flan distance_t=%d\n\t"
"flan algorithm_t=%d\n",
addedDescCount,
flannIndex->getDistance(),
flannIndex->getAlgorithm());
vector<std::string> names;
vector<int> types;
vector<std::string> strValues;
vector<double> numValues;
indexParams->getAll(names, types, strValues, numValues);
for (size_t i = 0; i < names.size(); i++)
printf("\tindex param: %s:\t type=%d val=%s %.2f\n",
names[i].c_str(), types[i],
strValues[i].c_str(), numValues[i]);
names.clear();
types.clear();
strValues.clear();
numValues.clear();
searchParams->getAll(names, types, strValues, numValues);
for (size_t i = 0; i < names.size(); i++)
printf("\tsearch param: %s:\t type=%d val=%s %.2f\n",
names[i].c_str(), types[i],
strValues[i].c_str(), numValues[i]);
}
void readIndex(const char* filename)
{
indexParams->setAlgorithm(cvflann::FLANN_INDEX_SAVED);
indexParams->setString("filename", filename);
// construct flannIndex now, so printParams works
train();
printParams();
}
void writeIndex(const char* filename)
{
printParams();
flannIndex->save(filename);
}
};
注意:據我所知,描述符本身必須分別序列化/反序列化。加載時,_prior_調用readIndex,描述符必須被反序列化並添加(即,使用FlannBasedMatcher :: add)。 – sircolinton 2016-11-16 16:34:41