#include <flann/flann.hpp>
#include <flann/util/matrix.h>
#include <iostream>
#include <ostream>
using namespace std;
struct MyPoint
{
float x ;
float y ;
MyPoint()
{
x = 0 ;
y = 0 ;
}
MyPoint(float x_ , float y_)
{
x = x_ ;
y = y_ ;
}
MyPoint(const MyPoint &my)
{
this->x = my.x ;
this->y = my.y ;
}
friend inline ostream &operator <<(ostream &os , const MyPoint &mp)
{
os<<mp.x<<","<<mp.y ;
return os ;
}
};
int nearestKSearch(float *data , int N , float *query , int knn , vector<int>&indices , vector<float> &distance) ;
int nearestRSearch(float *data , int N , float *query , float radius , vector<int> &indices , vector<float> &distance) ;
void main()
{
float *my_dataset = new float[1000 * 3] ;
for (int i = 0 ; i < 1000 ; ++i)
{
my_dataset[3 * i + 0] = i ;
my_dataset[3 * i + 1] = i ;
my_dataset[3 * i + 2] = i ;
}
float *my_query = new float[3] ;
for (int i = 0 ; i < 3 ; ++i)
{
my_query[0] = 500 ;
my_query[1] = 500 ;
my_query[2] = 500 ;
}
vector<int> k_indice(10) ;
vector<float> k_distance(10) ;
nearestKSearch(my_dataset , 1000 , my_query , 10 , k_indice , k_distance) ;
cout<<"查找点:("<<my_query[0]<<","<<my_query[1]<<","<<my_query[2]<<")"<<"最近10个点为:\n" ;
for (int i = 0 ; i < 10 ; ++i)
{
cout<<my_dataset[k_indice[i] * 3 + 0]<<","<<my_dataset[k_indice[i] * 3 + 1]<<","<<my_dataset[k_indice[i] * 3 + 2]<<" , distance = "<<k_distance[i]<<endl ;
}
cout<<"半径最近邻搜索!\n" ;
vector<int> radius_indice(1) ;
vector<float> radius_distance(1) ;
int return_N = nearestRSearch(my_dataset , 1000 , my_query , 10 , radius_indice , radius_distance) ;
cout<<my_dataset[radius_indice[0] * 3 + 0]<<","<<my_dataset[radius_indice[0] * 3 + 1]<<","<<my_dataset[radius_indice[0] * 3 + 2]<<" , distance = "<<radius_distance[0]<<endl ;
}
int nearestKSearch(float *data , int N , float *query , int knn , vector<int>&indices , vector<float> &distance)
{
flann::Matrix<float> dataset = flann::Matrix<float>(data , N , 3) ;
flann::Matrix<float> queryset = flann::Matrix<float>(query , 1 , 3) ;
flann::Index<flann::L2<float> > index(dataset , flann::KDTreeIndexParams(4)) ;
index.buildIndex() ;
flann::Matrix<int> indices_mat(&indices[0] , 1 , knn) ;
flann::Matrix<float> dist_mat(&distance[0] , 1 , knn) ;
int return_value = index.knnSearch(queryset , indices_mat , dist_mat , knn , flann::SearchParams(15)) ;
return return_value ;
}
int nearestRSearch(float *data , int N , float *query , float radius , vector<int> &indices , vector<float> &distance)
{
vector<vector<int> > radius_indices(1) ;
vector<vector<float> > radius_dists(1) ;
flann::Matrix<float> dataset = flann::Matrix<float>(data , N , 3) ;
flann::Matrix<float> queryset = flann::Matrix<float>(query , 1 , 3) ;
flann::Index<flann::L2<float> > index(dataset , flann::KDTreeIndexParams(4)) ;
index.buildIndex() ;
int neighbors_in_radius = index.radiusSearch(queryset , radius_indices , radius_dists , radius , flann::SearchParams(15)) ;
indices = radius_indices[0] ;
distance = radius_dists[0] ;
return neighbors_in_radius ;
}
flann库的最近邻搜索
最新推荐文章于 2023-02-16 11:33:17 发布