あなたが正しく質問していると分かっていれば、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つのコンポーネントであることに注意してください。また、すべての記述子ベクトルは同じ次元数を持つ必要があることに注意してください。
今後参考になるように、質問を明確にするようにしてください。私は "どのペアが一緒になっているか知っている"と "std :: vector"という私の例をベースにしています。答えをさらに明確にする必要がある場合は、その質問をより正確にしようとしてください。 –
penelope