OpenCV的hierachicalClustering函数中的参数`Distance d = Distance()`是什么?

时间:2015-04-16 05:08:10

标签: c++ opencv

我已经完成了问题,源代码和其他示例,我无法理解Distance d = Distance()参数在函数中的含义

template<typename Distance> int flann::hierarchicalClustering(const Mat& features, Mat& centers, const cvflann::KMeansIndexParams& params, Distance d=Distance())

this question的评论中提到了这一点,但我无法在任何地方找到距离类型。我导入了以下文件:

#include "opencv2/contrib/contrib.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/flann/flann.hpp"

我已检查过cvcvflanncv::flann名称空间,但无法找到任何内容。

这是我的代码:

int tmp = cv::flann::hierarchicalClustering<cv::L2<float>>(descriptors, centers, params, ______ );

___显然是最后一个参数的去向。我尝试了cv::L2<float>()之类的内容,但这种做法也不起作用。

在源代码中,它看起来像一个模板。

我也尝试过:

int tmp = cv::flann::hierarchicalClustering<float, float>(descriptors, centers, params);

我收到错误&#34;没有重载函数的实例&#34; cv :: flann :: hierachicalClustering&#34;匹配参数列表。参数类型是:(cv :: Mat,cv :: Mat,cv :: KMeansIndexParams)。

我正在使用OpenCV 2.4.11。

有什么想法吗?

FLANN user manual还有更多文档。看起来它被逐字复制到OpenCV中。

2 个答案:

答案 0 :(得分:2)

参数Distance d = Distance()是设置距离算法的默认方法参数。通常,这将是FLANN_DIST_L2。为什么你无法在任何地方找到Distance“类型”,因为它实际上是typename。 OpenCV选择使用C ++特化(通过模板)而不是继承来确保不同的距离函数具有相同的特征。

这是一个非常重要的主题,因此http://www.gotw.ca/publications/mxc++-item-4.htm应该提供相当无痛的介绍。如果我满足你的胃口,请查看Andrei Alexandrescu的开创性Modern C++ Design

答案 1 :(得分:2)

添加这个以供将来参考,因为我自己只是在与OpenCV FLANN课程挣扎

这对我有用:

// define parameters
cvflann::KMeansIndexParams kmeansParams(10, 100, cvflann::FLANN_CENTERS_KMEANSPP);
// note cvflann - not cv::flann - namespace there

int nClusters = flann::hierarchicalClustering<flann::L2<float>>(samples, centers, kmeansParams );
// note regular flann namespace here

问题在于,马克曼正在使用<cv::L2<float>>而不是<flann::L2<float>>

flann名称空间非常混乱,文档缺乏

由于模板的原因,很难在IDE中解决这个问题。