C++ KNN搜索为大量功能花费大量时间

C++ KNN搜索为大量功能花费大量时间,c++,opencv,image-processing,machine-learning,knn,C++,Opencv,Image Processing,Machine Learning,Knn,我正在使用基于FLANN的knnsearch。我的功能集包含4个大小为500*500的图像。我希望所有4幅图像中的所有点都是最近邻(查询集与功能集相同),但在opencv中使用cpp运行需要很多时间。是否可以采取任何措施来减少运行时间。 我已经设置了num_features=500*500和dimensionality=4。我想要所有4幅图像中每个点的距离和最近邻,因此距离和索引矩阵应具有与特征相同的元素数量。 这是密码 Mat features,temp[4]; //input is an a

我正在使用基于FLANN的knnsearch。我的功能集包含4个大小为500*500的图像。我希望所有4幅图像中的所有点都是最近邻(查询集与功能集相同),但在opencv中使用cpp运行需要很多时间。是否可以采取任何措施来减少运行时间。 我已经设置了num_features=500*500和dimensionality=4。我想要所有4幅图像中每个点的距离和最近邻,因此距离和索引矩阵应具有与特征相同的元素数量。 这是密码

Mat features,temp[4];
//input is an array of 4 images that contain features.

int num_data = input[0].rows * input[0].cols;
int num_queries = input[0].rows * input[0].cols;

temp[0] = input[0].clone(); 
temp[1] = input[1].clone();
temp[2] = input[2].clone(); 
temp[3] = input[3].clone();

temp[0] = temp[0].reshape(0, num_data); transpose(temp[0], temp[0]);
temp[1] = temp[1].reshape(0, num_data); transpose(temp[1], temp[1]);
temp[2] = temp[2].reshape(0, num_data); transpose(temp[2], temp[2]);
temp[3] = temp[3].reshape(0, num_data); transpose(temp[3], temp[3]);


vconcat(temp[0],temp[1],features);
vconcat(temp[2], features, features);
vconcat(temp[3], features, features);

Mat query = features.clone();

flann::KDTreeIndexParams indexParams(5);
flann::Index kdtree(features, indexParams);

Mat indices;
Mat dists;
int k = 3;

kdtree.knnSearch(query, indices, dists, k, flann::SearchParams(10));

Mat avg;
reduce(dists, avg, 1, CV_REDUCE_AVG);
特征的大小为250000*4

区和指数的大小为250000*3,平均值的大小为250000*1


我做错什么了吗?我试图在opencv中找到KNN搜索,但无法得到详细的解释。

KNN匹配有时比蛮力匹配慢。它取决于特征向量的长度。我从32位的长度听说蛮力法更快。用BF法试试。实际上,我只能用KNN法。我最关心的是所花费的时间,这在很大程度上取决于当前的功能大小。我不能减少功能的大小,但需要减少所花费的时间。我觉得可以做一些改变来加速程序,但我不明白它是如何工作的??