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