2012-02-29 17 views
9

Qualcuno capisce perché gli OpenCV 2 DescriptorMatcher::radiusMatch() e knnMatch() prendono un vector<vector<DMatch>>& matches? Sono un po 'confuso sul motivo per cui non sarebbe solo un vettore, dal momento che è solo una singola serie di punti nella scena che corrispondono all'immagine di allenamento, giusto?OpenCV DescriptorMatcher radiusMatch e knn Formato dei risultati di lettura

Ho qualcosa di simile:

void getMatchingPoints(
    const vector<vector<cv::DMatch> >& matches, 
    const vector<cv::KeyPoint>& keyPtsTemplates, 
    const vector<cv::KeyPoint>& keyPtsScene, 
    vector<Vec2f>& ptsTemplate, 
    vector<Vec2f>& ptsScene 
    ) 
{ 
    ptsTemplate.clear(); 
    ptsScene.clear(); 

    for (size_t k = 0; k < matches.size(); k++) 
    { 
     for (size_t i = 0; i < matches[k].size(); i++) 
     { 
      const cv::DMatch& match = matches[k][i]; 
      ptsScene.push_back(fromOcv(keyPtsScene[match.queryIdx].pt)); 
      ptsTemplate.push_back(fromOcv(keyPtsTemplates[match.trainIdx].pt)); 
     } 
    } 
} 

ma io sono un po 'confuso su come mappare in realtà il ca. posizione dell'oggetto una volta che li ho tutti in ptsScene. I punti mi sembrano sparsi quando li disegno e basta, quindi penso che mi manchi quello che rappresentano i vettori nidificati.

risposta

23

La funzione knnMatch restituirà il k primi vicini partite, vale a dire se si chiama knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3) dove in questo caso k=3, quindi per ogni punto di formazione, troverà le 3 migliori partite dal set di query.

In termini di vector<vector<DMatch>>, ciò significa che l'esterno vector è un vettore di ogni query-> partita in treno, e l'interno vector è un vettore di tuoi k partite più vicini.

C'è un buon esempio di come utilizzare queste corrispondenze k insieme a un metodo di controllo incrociato in this altra domanda.

Se si desidera un semplice 1-1 corrispondente, è possibile chiamare knnMatch con k = 1 che restituirà un vettore interno di dimensione 1, o chiamare match che emette partite in forma vector<DMatch> senza secondo vettore.

+1

molto accurato, grazie mille! –

Problemi correlati