我在论坛或邮件列表上没有看到这个答案。我不得不深入研究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