Как использовать класс GenericIndex в opencv

Поскольку Index_ является устаревшим классом во фланговой библиотеке, я пытаюсь использовать 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. Обратите внимание, что пространство имен функтора cvflann не cv::flann как с GenericIndex (почему разработчики решили иметь эти два одинаковых, но не совсем пространства имен вне моего понимания).

Index_ а также GenericIndex В остальном у вас довольно похожие интерфейсы, поэтому вам, вероятно, не придется ничего менять.

Другие вопросы по тегам