【问题标题】:What is the parameter `Distance d = Distance()` in OpenCV's hierachicalClustering function?OpenCV分层聚类函数中的参数“距离d =距离()”是什么?
【发布时间】:2016-04-04 21:43:43
【问题描述】:

我已经阅读了问题、源代码和其他示例,但我一生都无法理解函数中 Distance d = Distance() 参数的含义

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

它在this question 的 cmets 中得到解决,但我在任何地方都找不到距离类型。我已导入以下文件:

#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&lt;float&gt;() 的方法,但这也不起作用。

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

我也试过了:

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 中的。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

    这是一个重要的主题,所以http://www.gotw.ca/publications/mxc++-item-4.htm 应该提供一个相当轻松的介绍。如果我激起了你的胃口,请查看 Andrei Alexandrescu 的开创性 Modern C++ Design

    【讨论】:

    • 非常感谢!这是一个很好的解释,我想花时间详细了解一下,但是,在短期内,可以在那里进行的示例论证是什么?我试过int tmp = cv::flann::hierarchicalClustering&lt;cv::L2&lt;float&gt;&gt;(descriptors, centers, params, cvflann::FLANN_DIST_L2); 但没有运气
    • @marcman:查看defines.h获取完整列表,您应该可以使用FLANN_DIST_MANHATTANFLANN_DIST_L1FLANN_DIST_MINKOWSKI等等。
    • 我试过 cvflann::FLANN_DIST_L2 (我编辑了我上面的评论),它仍然说它不受支持。显然 flann_distance_t 在那里不合适。
    • @marcman:我没有设置 OpenCV,所以我无法自己测试东西,但是阅读了一些 answers.opencv.org,看起来可能无法设置不同的距离度量,因为一些重构问题。类似flann::hierarchicalClustering&lt;cv::flann::Hamming&lt;unsigned char&gt; &gt; 的东西有用吗?
    • 它没有。唉,我认为这个问题可能超出了我对 C++(以及一般的 PL)的理解深度。我将把问题留在这里,也许其他人已经解决了它,但与此同时,我将尝试不同的集群解决方案。感谢您的帮助!
    【解决方案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
    

    问题在于 marcman 使用的是 &lt;cv::L2&lt;float&gt;&gt; 而不是 &lt;flann::L2&lt;float&gt;&gt;

    flann 命名空间非常混乱,而且缺乏文档

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

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 2016-02-16
      • 1970-01-01
      • 2016-05-28
      • 2016-01-10
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多