找到最近的邻居 - OpenCV

时间:2012-03-22 15:56:06

标签: c++ opencv

我有一组openCV Point2f类型的图像点(坐标)。我想找到该组中每个点的4个最近邻居。 openCV中是否有任何特定的内置函数来执行此操作,还是应该测量每个点之间的距离并确定最接近的四个?

4 个答案:

答案 0 :(得分:9)

以下代码将有助于从一组点中找到所选点的最近邻居。

vector<Point2f> pointsForSearch; //Insert all 2D points to this vector
flann::KDTreeIndexParams indexParams;
flann::Index kdtree(Mat(pointsForSearch).reshape(1), indexParams);
vector<float> query;
query.push_back(pnt.x); //Insert the 2D point we need to find neighbours to the query
query.push_back(pnt.y); //Insert the 2D point we need to find neighbours to the query
vector<int> indices;
vector<float> dists;
kdtree.radiusSearch(query, indices, dists, range, numOfPoints);

indices给出了所选邻居的索引,dists给出了所选邻居的距离。

答案 1 :(得分:2)

This教程可能会有所帮助。

它提供了一个培训示例(据我所知,使用KNearest构造函数或train()方法;检查documentation)并识别项目(通过利用,作为@sietschie提到find_nearest()方法)。

find_nearest()采用int k值表示分类所基于的邻居所需的数量,k个邻居的标签可以选择性地通过参数neighborResponses返回,如find_nearest()所示。 {1}}之前链接的文档:

  

neighborResponses - 对应的可选输出值   邻居。

其中,作为文档的一部分,neighbors是:

  

neighbors - 指向邻居向量的可选输出指针   他们自己。

我对这些参数没有经验,但是如果我理解正确,邻居提供实际邻居的值,而 neighborResponses 提供他们的标签。

答案 2 :(得分:2)

以下是如何找到3个最近点(370,464)的小例子:

#include "opencv2/flann/miniflann.hpp"

flann::KDTreeIndexParams indexParams;
flann::Index kdtree(Mat(cloud2d).reshape(1), indexParams);
vector<float> query;
query.push_back(370); 
query.push_back(464); 
vector<int> indices;
vector<float> dists;
kdtree.knnSearch(query, indices, dists, 3);
// cloud2d[indices[0]] -- is your first point now
// cloud2d[indices[1]] and cloud2d[indices[2]] -- is your 2nd and 3rd point

请注意,如果某些点具有NAN坐标,则函数会表现得很疯狂,如果您之前将其除以0.0,则可能就是这种情况。

答案 3 :(得分:1)

您可以使用k最近邻分类器CvKNearest。在使用所有积分训练分类器后,您可以通过调用函数k来获取CvKNearest::find_nearest最近邻居。