2012-02-29 6 views
9

誰もOpenCV 2 DescriptorMatcher::radiusMatch()knnMatch()vector<vector<DMatch>>& matchesになる理由を知っていますか?私はちょうどベクトルではない理由についてちょっと混乱しています。なぜなら、それはトレーニング画像に対応するシーン内のポイントの単なる配列なので、そうですか?OpenCV DescriptorMatcher radiusMatchとknnMatchの結果フォーマット

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

を私は実際には約マップする方法について少し困惑している:

私はこのような何かを持っています。一度オブジェクトの場所は、すべてptsSceneにそれらを持っています。ポイントは私がそれらを描くときに私に散らばっているように見えるので、入れ子にされたベクトルが何を表しているのか見当たりません。この場合k=3には、各トレーニングのポイントのために、それはクエリセットから3本のベストマッチを見つけるknnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3)を呼び出す場合

答えて

23

knnMatch機能は、すなわち、k最近傍が一致して返します。あなたのvector<vector<DMatch>>の面では

、これは外側vectorが各query->列車の試合のベクトルであり、内側のvectorがあなたのk最寄りの試合のベクトルであることを意味します。

これらのkの一致方法と、thisのクロスチェック方法の他の質問には、かなり良い例があります。

単純な1-1のマッチングが必要な場合は、サイズ1の内部ベクトルを返すkn = 1のknnMatchを呼び出すか、matchを呼び出して、vector<DMatch>という形式の一致を2番目のベクトルなしで出力します。

+1

非常に徹底してありがとう! –

関連する問題