我已经看过了问题、源代码和其他示例,但我始终无法理解Distance d = Distance()参数在函数中的含义
template int flann::hierarchicalClustering(const Mat& features, Mat& centers, const cvflann::KMeansIndexParams& params, Distance d=Distance())
它在this question的注释中被解决了,但是我在任何地方都找不到Distance类型。我已经导入了以下文件:
#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"我检查了cv、cvflann和cv::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);我得到错误“没有重载函数的实例"cv::flann::hierachicalClustering”匹配参数列表。参数类型是:(cv::Mat,cv::Mat,cv::KMeansIndexParams)。
我使用的是OpenCV 2.4.11。
有什么想法吗?
在FLANN user manual中还有更多的文档。它看起来像是被逐字复制到OpenCV中的。
发布于 2015-04-16 13:47:34
参数Distance d = Distance()是设置距离算法的默认方法参数。通常,这将是FLANN_DIST_L2。在任何地方都找不到Distance“类型”的原因是因为它实际上是一个typename。OpenCV选择使用C++特殊化(通过模板)而不是继承,以确保不同的距离函数具有相同的特征。
这是一个很重要的主题,所以http://www.gotw.ca/publications/mxc++-item-4.htm应该提供一个相当简单的介绍。如果我激起了你的胃口,看看安德烈·亚历山大·雷斯库的开创性的Modern C++ Design。
发布于 2016-04-04 21:43:43
添加这篇文章以供将来参考,因为我自己也在努力处理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问题是marcman使用的是<cv::L2<float>>而不是<flann::L2<float>>
flann名称空间非常令人困惑,而且缺乏文档
由于模板的原因,在IDE中很难弄清楚这一点。
https://stackoverflow.com/questions/29665763
复制相似问题