2012-11-10 14 views
8

è questa funzione di OpenCV drawMatches():OpenCV drawMatches - queryIdx e trainIdx

void drawMatches(Mat img1, vector<KeyPoint> keypoints1, 
       Mat img2, vector<KeyPoint> keypoints2, 
       vector<DMatch> matches, 
       Mat outImg) //want keypoints1[i] = keypoints2[matches[i]] 

noti che matches è di tipo vector<DMatch>. Ecco il DMatch costruttore:

DMatch(int queryIdx, int trainIdx, float distance) 

Presumibilmente, queryIdx è un indice in una serie di punti chiave, e trainIdx è un indice nell'altra serie di punti chiave.

La domanda: E 'vero che queryIdx indici in keypoints1 e trainIdx indici in keypoints2? O è il contrario?

risposta

18

Dipende da come si ottiene matches.

Se si chiama funzione match nell'ordine:

match(descriptor_for_keypoints1, descriptor_for_keypoints2, matches) 

poi queryIdx riferisce a keypoints1 e trainIdx riferisce a keypoints2, o viceversa.

+5

Dovrebbero rendere più chiara la funzione. L'interfaccia e il linguaggio non sono coerenti. – aledalgrande

1

la variabile "corrisponde a" è un elenco di oggetti DMatch.

se siamo iterazione di questo elenco di DMatch oggetti, quindi ogni elemento avrà i seguenti attributi:

  1. item.distance: questo attributo ci dà la distanza tra i descrittori. Una distanza inferiore indica una corrispondenza migliore.
  2. item.trainIdx: questo attributo ci fornisce l'indice del descrittore nell'elenco dei descrittori del treno (nel nostro caso, è l'elenco di descrittori in img2).
  3. item.queryIdx: questo attributo ci fornisce l'indice del descrittore nell'elenco di descrittori di query (nel nostro caso, è l'elenco di descrittori in img1).
  4. item.imgIdx: questo attributo ci fornisce l'indice dell'immagine del treno.