1

由于Index_是 flann 库中已弃用的类,我正在尝试使用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;
};
4

1 回答 1

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 范数的距离度量的函子在哪里。请注意,仿函数的命名空间是cvflann,而不是(为什么开发人员决定拥有这两个相似但不完全的命名空间,我无法理解)cv::flannGenericIndex

Index_并且GenericIndex具有非常相似的界面,因此您可能无需更改任何内容。

于 2014-09-17T02:12:41.083 回答