2012-02-29 10 views
9

¿Alguien sabe por qué el OpenCV 2 DescriptorMatcher::radiusMatch() y knnMatch() toman un vector<vector<DMatch>>& matches? Estoy un poco confundido acerca de por qué no sería solo un vector, ya que es solo una serie de puntos en la escena que corresponden a la imagen de entrenamiento, ¿verdad?OpenCV DescriptorMatcher radiusMatch y knnMatch formato de resultado

Tengo algo como esto:

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

pero estoy un poco confundido acerca de cómo asignar la realidad aprox. ubicación del objeto una vez que los tengo a todos en ptsScene. Los puntos me parecen dispersos cuando los dibujo, por lo que creo que me falta lo que representan los vectores anidados.

Respuesta

23

La función devolverá el knnMatchk vecino más cercano coincide, es decir, si se llama a knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3) donde en este caso k=3, a continuación, para cada punto de la formación, encontrará los 3 mejores fósforos de la consulta establecidos.

En términos de su vector<vector<DMatch>>, esto significa que el exterior vector es un vector de cada query-> partido de tren, y el interior vector es un vector de sus k partidos más próximos.

Hay un buen ejemplo de cómo utilizar estas coincidencias k junto con un método de comprobación cruzada en this otra pregunta.

Si desea una coincidencia simple de 1-1, puede llamar a knnMatch con k = 1, que devolverá un vector interno de tamaño 1, o simplemente llame a match que genera coincidencias en el formato vector<DMatch> sin segundo vector.

+1

muy completo, muchas gracias! –