2012-03-22 7 views
5

Tengo un conjunto de puntos de imagen tipo openCV Point2f (coordenadas). Quiero encontrar los 4 vecinos más cercanos de cada punto en ese conjunto. ¿Hay alguna función de compilación específica en openCV para hacer esto o debería medir la distancia entre cada punto y decidir los cuatro más cercanos?Buscar vecinos más cercanos - OpenCV

Respuesta

1

Puede usar el clasificador de vecino más próximo k CvKNearest. Después de entrenar al clasificador con todos sus puntos, puede obtener el k vecinos más cercanos llamando a la función CvKNearest::find_nearest.

2

This tutorial podría ser útil.

Ofrece un ejemplo de la formación (por lo que yo sé, ya sea mediante el constructor o KNearesttrain() método; compruebe el documentation) y el reconocimiento de objetos (mediante la utilización, como @sietschie mencionado find_nearest() método).

find_nearest() toma un valor int k que representa la cantidad necesaria de vecinos sobre la cual clasificación se basa, las etiquetas de los k vecinos podrían ser devueltos opcionalmente mediante el parámetro neighborResponses, como tomado de find_nearest() documentación vinculado anteriormente:

neighborResponses - Valores de salida opcionales para los vecinos correspondientes .

donde, de nuevo como parte de la documentación, neighbors son:

vecinos - punteros de salida opcionales a la vecina vectores sí mismos.

yo no tengo experiencia con esos parámetros, no obstante, de he entendido bien, vecinos ofrecen los valores reales de los vecinos, mientras que neighborResponses ofrece sus etiquetas.

+1

La URL solicitada/2010/10/k-vecinos-cercanos-en-opencv/no se encontró en este servidor. –

+1

Gracias @ JürgenK .; el blog parece haber sido renovado: actualicé la url. –

+0

obtengo un tiempo de espera a petición de la documentación –

8

El siguiente código ayudará a encontrar los vecinos más cercanos de un punto seleccionado de un conjunto de puntos.

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); 

índices proporciona los índices de los vecinos seleccionados y dists da las distancias para los vecinos seleccionados.

1

Aquí es pequeño ejemplo de cómo encontrar 3 puntos más cercanos (370464):

#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 

Tenga en cuenta que la función se comporta loco si algunos de los puntos tienen coordenadas NAN, este puede ser el caso si se divide por 0,0 en algún lugar antes.

+0

¿Cómo configuras cloud2d? Tengo un std :: vector raaj

+0

try vector

Cuestiones relacionadas