2012-03-15 14 views
7

ここに私の問題があります。私は手動で複数の画像上のSURFでキーポイントの特徴を抽出しました。しかし、私はすでにポイントのペアが一致することを知っている。問題は、私は一致するペアを作成しようとしていますが、私はどのように理解できません。私はコードを見てみましたが、それは混乱です。手動で機能キーポイントからOpenCVでペアワイズマッチングする

今のところ、features.descriptorsのサイズ(行列)はキーポイントの数と同じです(もう1つの次元は1です)。コードでは、一致するペアを検出するために、ディスクリプタのみを使用しているため、行(または列、わかりません)または2つのディスクリプタ行列を比較して共通点があるかどうかを判断します。

私の場合、イメージ1のキーポイントiとイメージ2のキーポイントjが一致することはすでに分かっています。これをどのようにしてMatchesInfo値として記述しますか?特に、要素std :: vector < cv :: DMatch>のマッチが一致します。

EDIT:このため、このようなマッチャーなどを使用する必要はありません。私はどのペアが一緒に行くのか知っています!

+0

今後参考になるように、質問を明確にするようにしてください。私は "どのペアが一緒になっているか知っている"と "std :: vector "という私の例をベースにしています。答えをさらに明確にする必要がある場合は、その質問をより正確にしようとしてください。 – penelope

答えて

5

あなたが正しく質問していると分かっていれば、OpenCV cv::drawMatchesで描画したり、いくつかの同様のOpenCV関数を使って描画する目的でキーポイントの一致をstd::vector<cv::DMatch>にしたいとします。あなたがのために試合についてのより完全な情報が必要な場合は、

const cv::Mat& pic1 = img_1_var; 
const cv::Mat& pic2 = img_2_var; 
const std::vector <cv::KeyPoint> &feats1 = img_1_feats; 
const std::vector <cv::KeyPoint> &feats2 = img_2_feats; 
    // you of course can work directly with original objects 
    // but for drawing you only need const references to 
    // images & their corresponding extracted feats 

std::vector <std::pair <int, int> > aMatches; 
    // fill aMatches manually - one entry is a pair consisting of 
    //  (index_in_img_1_feats, index_in_img_2_feats) 


// the next code draws the matches: 
std::vector <cv::DMatch> matches; 
matches.reserve((int)aMatches.size()); 

for (int i=0; i < (int)aMatches.size(); ++i) 
    matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second, 
         std::numeric_limits<float>::max())); 

cv::Mat output; 

cv::drawMatches(pic1, feats1, pic2, feats2, matches, output); 

cv::namedWindow("Match", 0); 
cv::setWindowProperty("Match", CV_WINDOW_FULLSCREEN, 1); 
cv::imshow("Match", output);  
cv::waitKey(); 
cv::destroyWindow("Match"); 

代わりに:私はまた、「手で」マッチングをやっていたので、最近、ここで任意のマッチがstd::vector<std::pair <int, int> > aMatches中にもともと含まれて汲み上げ、ウィンドウに表示します私のコードです描画より複雑な目的の場合は、マッチの間隔を適切な値に設定することもできます。例えば。これで

for (int i=0; i < (int)aMatches.size(); ++i) 
    matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second, 
         std::numeric_limits<float>::max())); 

(このためのノートも必要とされている記述子ベクトルを搭載したリファレンス):

cv::L2<float> cmp; 

const std::vector <std::vector <float> > &desc1 = img_1_feats_descriptors; 
const std::vector <std::vector <float> > &desc2 = img_2_feats_descriptors; 

for (int i=0; i < (int)aMatches.size(); ++i){ 
    float *firstFeat = &desc1[aMatches[i].first]; 
    float *secondFeat = &desc2[aMatches[i].second]; 
    float distance = cmp(firstFeat, secondFeat, firstFeat->size()); 
    matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second, 
         distance)); 
} 
あなたは L2距離を使用して距離を計算する場合は、次の行を交換する必要があります

最後のスニペットでは、descX[i]featsX[i]の記述子であり、内部ベクトルの各要素が記述子ベクトルの1つのコンポーネントであることに注意してください。また、すべての記述子ベクトルは同じ次元数を持つ必要があることに注意してください。

+0

私の記述子はcv :: Mat型です。どのようにベクトルに変換するのですか?>?それとも自然に変換することができますか? – widgg

関連する問題