我已经完成了问题,源代码和其他示例,我无法理解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"
我已检查过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);
我收到错误&#34;没有重载函数的实例&#34; cv :: flann :: hierachicalClustering&#34;匹配参数列表。参数类型是:(cv :: Mat,cv :: Mat,cv :: KMeansIndexParams)。
我正在使用OpenCV 2.4.11。
有什么想法吗?
FLANN user manual还有更多文档。看起来它被逐字复制到OpenCV中。
答案 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中解决这个问题。