- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两组点 (cv::Point2f):setA 和 setB。对于 setA 中的每个点,我想在 setB 中找到它最近的邻居。所以,我尝试了两种方法:
线性搜索:对于 setA 中的每个点,只需简单地扫描 setB 中的所有点以找到最近的点。
使用 opencv kd-tree:
_ 首先,我使用 opencv flann 为 setB 构建了一个 kd-tree:
cv::flann::KDTreeIndexParams indexParams;
cv::flann::Index kdTree(cv::Mat(setB).reshape(1), indexParams);
_ 然后,对于 setA 中的每个点,我都会查询以找到最近的邻居:
kdTree.knnSearch(point_in_setA, indices, dists, maxPoints);
注意:我将 maxPoints 设置为 1,因为我只需要最近的一个。
我做了一些研究,并针对每种情况得出了一些时间复杂度:
线性搜索:O(M*N)
Kd-Tree: NlogN + MlogN => 第一项用于构建 kd-tree,第二项用于查询
其中 M 是 setA 中的点数,N 是 setB 中的点数。 N的范围:100~1000,M的范围:10000~100000。
因此,kd-tree 应该比线性搜索方法运行得快得多。然而,当我在笔记本电脑上运行真实测试时,结果是 kd-tree 方法比线性搜索慢(0.02~0.03s vs 0.4~0.5s)。
当我进行分析时,我在 knnSearch() 函数处遇到了热点,它占用了 20.3% 的 CPU 时间,而线性搜索只占用 7.9%。
嗯,网上看了一些文章,说查询kd-tree一般需要logN。但我不确定 opencv 如何实现它。
有人知道这里出了什么问题吗?在 kd-tree 中是否有任何我应该调整的参数,或者我在代码或计算中的某处出错了?
最佳答案
取自Flann documentation .对于低维数据,您应该使用KDTreeSingleIndexParams。
KDTreeSingleIndexParams
当传递这种类型的对象时,索引将包含一个针对搜索低维数据(例如 3D 点云)优化的单个 kd 树,在您的情况下是 2D 点。您可以使用 leaf_max_size 参数并分析您的结果。
struct KDTreeSingleIndexParams : public IndexParams
{
KDTreeSingleIndexParams( int leaf_max_size = 10 );
};
max leaf size: The maximum number of points to have in a leaf for not
branching the tree any more
关于C++ - 使用 opencv flann 寻找最近的邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29488832/
http://opencv.willowgarage.com/documentation/cpp/features2d_common_interfaces_of_descriptor_matchers
我正在尝试运行检测图像特征的应用程序,但是当我运行 BRISK 的代码时功能,BRIEF描述符和 FlannBased匹配器,它崩溃并说: OpenCV Error: Unsupported form
我编写了一个程序来计算 SURF 特征,然后使用 FLANN(最近邻快速库)来匹配和显示最近邻。现在可以将 FLANN 的使用视为使用机器学习,因为我的理解是它是 k-最近邻搜索的近似版本,被视为机器
我正在尝试将 FLANN 与 ORB 描述符一起使用,但 opencv 会因以下简单代码而崩溃: vector > dbKeypoints; vector dbDescriptors; vector
还是用flann可能?我不是最有经验的编码员,我可能也只是忽略了一些基本的东西(C++,OpenCV 2.4.3)。 问题 : 我有两个点云,想要计算位移图。我正在尝试使用flann .lib从第二个
我正在尝试在大型 3D 点数据集中查找相邻节点的确切数量。目标是让数据集的每个点检索具有给定半径的区域中所有可能的邻居。 FLANN 确保对于低维数据可以检索到确切的邻居,而与蛮力搜索相比,情况似乎并
将所有描述符添加到 FLANN 索引后,我使用以下代码保存它: flann = cv2.flann.Index() for index, filename in enumerate(o
我一直在尝试设置一个基本的 3D 点 flann knnsearch,但到目前为止还没有成功地让它工作。我尝试了很多不同的东西,但都返回了错误。有一段时间我遇到了 cv::flann::Index k
您好,我正在尝试对整数数据进行最近邻查询。似乎 cv::flann 不支持这个。这是真的吗? 最佳答案 是的,可以对整数数据使用 FLANN 最近邻搜索。您需要对整数使用距离度量。一些距离度量是模板,
我有一张全景图,以及在该全景图中看到的建筑物的较小图像。我想要做的是识别那个较小图像中的建筑物是否在那个全景图像中,以及这 2 个图像如何排列。 对于第一个示例,我使用的是全景图像的裁剪版本,因此像素
我正在使用 opencv 2.4.4 flann。 我指的是:http://docs.opencv.org/2.4.4/modules/flann/doc/flann_fast_approximate
这正常吗?当我尝试暴力匹配器时,结果每次都是一致的,但 flann 不是。少量的关键点会匹配到不同的地方。我正在使用 Android 包装器编写代码,关键点检测器和描述符是 SURF,如下所示: Ma
我将 flann 与使用大量 RAM 的大型索引一起使用。 我希望能够在多个进程之间共享 flann 索引。 是否可以让 flann 使用内存映射文件作为其索引,以便在多个进程之间共享? 最佳答案 我
我想利用 FLANN 库进行多标签分类。我知道 FLANN 库用于计算最近邻,但我不确定如何将它用于分类目的。有没有办法将其插入 Scikit-Learn 或其他库中。 最佳答案 FLANN写在 c+
我尝试用cmake编译FLANN,但唯一的结果就是头疼。 所以我找到了here这个解决方案通过 PCL 存储库和突触。安装似乎很顺利,但现在我不知道如何使用安装的包。 引用 FLANN 的 docum
编辑(感谢 Barry 的评论)我需要复制 FLANN 搜索索引以在 vector 中使用它们,但是当拷贝超出范围时它会产生访问冲突。崩溃的最小代码是: #include #include const
我想做半径搜索来找到所有有效的邻居,但它似乎给了我错误的结果。这是我的代码 #include "opencv/cv.hpp" #include #include int main () {
我正在编写一个基于 surf 的图像匹配算法。我用 400 hessian 阈值初始化 surf: surf = cv2.SURF(400) 并进行了 flann 匹配。 但它运行得太慢(在大量图像上
我写了一个程序来匹配两张图片。这是代码。但如果我使用 BruteForceMatcher>(不是 flann),它就可以工作。 #include #include "opencv2/core/cor
我有一组点云(点云数≈200万)。我想为点群中的每个点找到最近的 k 邻居。我做了这样的事情 flann::Index flann_index(data_m, flann::KDTreeIndexPa
我是一名优秀的程序员,十分优秀!