Как использовать класс 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
В остальном у вас довольно похожие интерфейсы, поэтому вам, вероятно, не придется ничего менять.