OpenCV DescriptorMatcher radiusMatch et knnMatch format de résultat
Quelqu'un arrive à savoir pourquoi le OpenCV 2 DescriptorMatcher::radiusMatch()
et knnMatch()
prendre un vector<vector<DMatch>>& matches
? Je suis un peu confus au sujet de pourquoi il ne serait pas juste d'un vecteur, puisqu'il suffit d'un seul tableau de points dans la scène qui correspondent à la formation de l'image, à droite?
J'ai quelque chose comme ceci:
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));
}
}
}
mais je suis un peu confus sur la façon de faire la carte de l'env. l'emplacement de l'objet une fois que je les ai tous dans ptsScene
. Les points semblent dispersés à moi quand je viens de les dessiner, donc je pense que je suis absent ce imbriquées les vecteurs représentent.
Vous devez vous connecter pour publier un commentaire.
La
knnMatch
fonction retourne lek
plus proche voisin, les matchs, c'est à dire si vous appelezknnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3)
où dans ce cask=3
, puis pour chaque point, il va trouver les 3 meilleurs matchs de la requête ensemble.En termes de votre
vector<vector<DMatch>>
, cela signifie que l'extérieurvector
est un vecteur de chaque query->train de match, et l'intérieurvector
est un vecteur de votrek
plus proche de matchs.Il s'agit d'un bon exemple d'utilisation de ces
k
matchs avec un croix-méthode de vérification dans cette autre question.Si vous voulez une simple 1-1 correspondant, puis vous pouvez appeler knnMatch avec k=1, qui sera de retour intérieure d'un vecteur de taille 1, ou tout simplement appeler
match
les sorties qui correspond à la formevector<DMatch>
sans second vecteur.