- 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/
我从 SpatialPolygonsDataFrame 开始,它包含用于创建加纳各地区 map 的数据(可在 http://www.diva-gis.org/datadown 获取)。我正在尝试创建一
我遇到了一个问题,我需要根据存储在前一个元素中的信息修改容器的元素。示例: 如果前一个 vector 元素可被 2 整除,则将当前元素乘以 10 vector -> [12, 11, 33, 10]
总的来说,我对脚本编写还很陌生。我正在编写一个 expect 脚本,它通过 ssh 进入 Cisco 交换机,并运行“show cdp neighbors”命令来获取连接到交换机的所有设备的列表。然后
我正在尝试比较节点的值。使用 flood-fill 算法,我能够垂直和水平检查网格的每个节点。现在我必须更新我的代码以检查位于对 Angular 线上的单元格,如下图所示: 红色是当前节点,黄色是需要
我使用预先计算的指标使用 Scikit-Learn 的最近邻/半径分类。这意味着,我将成对距离的 n_samples_train x n_samples_train 矩阵传递给分类器的拟合方法。 现在
我有一个大的稀疏图,我将其表示为邻接矩阵(100k x 100k 或更大),存储为边数组。具有(非稀疏)4 x 4 矩阵的示例: 0 7 4 0 example_array = [ [7,1,2],
从有向图中并给出两个顶点 (v, u) 我需要找到:共同的“出”邻居和共同的“入”邻居。 例如: import networkx as nx ghybrid = nx.DiGraph() ghybri
我正在使用 JavaScript 进行图像处理,我想知道是否有任何通用公式可以确定像素的 x 邻居。 我知道对于 3*3 的正方形,可以使用特定的 x 和 y 像素确定 8 个邻居。 (x-1,y-1
在 CentOS 6.4(内核 2.6.32)上,为什么下面的第二个 arping 调用会创建一个新的 ARP 表条目,而第一个不会?网络行为是相同的,我感到困惑的是,在我看来,系统调用实际上是等同的
我是一名优秀的程序员,十分优秀!