2012-03-22 10 views
5

Ho un set di punti immagine (coordinate) di tipo point2f openCV. Voglio trovare i 4 vicini più vicini di ogni punto di quel set. Esiste qualche funzione build-in specifica in openCV per fare questo o devo misurare la distanza tra ogni punto e decidere i quattro più vicini?Trova i vicini più vicini - OpenCV

risposta

1

È possibile utilizzare il classificatore k Nearest Neighbor più prossimo CvKNearest. Dopo aver addestrato il classificatore con tutti i punti, è possibile ottenere i vicini più vicini k chiamando la funzione CvKNearest::find_nearest.

2

This tutorial potrebbe essere utile.

Si offre un esempio di formazione (per quanto ne so sia utilizzando il costruttore KNearest o train() metodo, verificare il documentation) e rilevazione delle componenti (utilizzando, come menzionato @sietschie find_nearest() metodo).

find_nearest() assume un valore int k rappresenta la quantità necessaria di vicini su cui si basa la classificazione, etichette k vicini potrebbero essere opzionalmente restituite tramite il parametro neighborResponses, così come indicato nella find_nearest() documentazione collegata in precedenza:

neighborResponses - Valori di output opzionali per i corrispondenti vicini.

in cui, ancora una volta come parte della documentazione, neighbors sono:

vicini - puntatori uscita opzionali al prossimo vettori stessi.

Non ho sperimentato con questi parametri, tuttavia fornito ho capito bene, vicini offrono valori effettivi dei vicini, mentre neighborResponses offre loro etichette.

+1

L'URL richiesto/2010/10/k-neighbor-neighbors-in-opencv/non è stato trovato su questo server. –

+1

Grazie @ JürgenK .; il blog sembra essere stato rinnovato - ho aggiornato l'url. –

+0

ottengo un timeout su richiesta della documentazione –

8

Il seguente codice aiuterà a trovare i vicini più vicini di un punto selezionato da una serie di punti.

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

indici dà gli indici di vicini e dists selezionati dà le distanze per i vicini selezionati.

1

Ecco piccolo esempio come trovare 3 punti più vicini alla struttura (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 

Si prega di notare che la funzione si comporta folle se alcuni punti hanno coordinate NAN, questo può essere il caso se si divide da 0.0 da qualche parte prima.

+0

Come si installa cloud2d. Ho uno std :: vector raaj

+0

try vector

Problemi correlati