2013-11-25 69 views
1

由于Index_是flann库中不推荐使用的类,因此我试图使用GenericIndex类,这是一个模板类。我不知道如何为这个类创建一个对象。如何在opencv中使用GenericIndex类

在flann.hpp类定义为如下:

template <typename Distance> 
class GenericIndex 
{ 
public: 
     typedef typename Distance::ElementType ElementType; 
     typedef typename Distance::ResultType DistanceType; 

     GenericIndex(const Mat& features, const ::cvflann::IndexParams& params, Distance distance = Distance()); 

     ~GenericIndex(); 

     void knnSearch(const vector<ElementType>& query, vector<int>& indices, 
         vector<DistanceType>& dists, int knn, const ::cvflann::SearchParams& params); 
     void knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const ::cvflann::SearchParams& params); 

     int radiusSearch(const vector<ElementType>& query, vector<int>& indices, 
         vector<DistanceType>& dists, DistanceType radius, const ::cvflann::SearchParams& params); 
     int radiusSearch(const Mat& query, Mat& indices, Mat& dists, 
         DistanceType radius, const ::cvflann::SearchParams& params); 

     void save(std::string filename) { nnIndex->save(filename); } 

     int veclen() const { return nnIndex->veclen(); } 

     int size() const { return nnIndex->size(); } 

     ::cvflann::IndexParams getParameters() { return nnIndex->getParameters(); } 

     FLANN_DEPRECATED const ::cvflann::IndexParams* getIndexParameters() { return nnIndex->getIndexParameters(); } 

private: 
     ::cvflann::Index<Distance>* nnIndex; 
}; 

回答

1

要使用GenericIndex作为与Index_做了你必须在模板实例指定的,而不是要素类型的距离函子。在flann/dist.h中定义了许多距离函子:L1,L2,MinkowskyDistance等。这些自身是模板,通过要素类型进行参数化。

因此,凡与Index_你声明:

cv::flann::Index_<int> index; 

随着GenericIndex你(做示例):

cv::flann::GenericIndex<cvflann::L2<int> > index; 

哪里cvflann::L2是实现L2 norm基于距离度量函子。请注意,仿函数的名称空间是cvflann,而不是cv::flannGenericIndex(为什么开发人员决定让这两个相似但不太完全的名称空间不在我身边)。

Index_GenericIndex有其他非常相似的接口,所以你可能不需要改变任何东西。

+0

嗨,你能给我一些关于如何构建'cv :: flann :: GenericIndex'的指导,我发现opencv doc很难理解。非常感谢你。 'cv :: flann :: GenericIndex > index(feature,params,Distance)',我知道特征是cv :: Mat,但我对如何构造参数和距离感到困惑。真的需要一些帮助。 – ted930511

+0

正如[here]所述(https://docs.opencv.org/trunk/db/d18/classcv_1_1flann_1_1GenericIndex.html#a8fff14185f9f3d2f2311b528f65b146c),对于'params'参数,您必须创建一个'IndexParams'子类的实例,例如'KDTreeIndexParams','CompositeIndexParams'等。不同的参数子类将产生具有不同搜索策略的索引。 'distance'参数可以省略,因为它被赋予一个默认值。 – xperroni