いくつかのシーン画像でテンプレート画像を見つけたいです。そこでHomography
、シーン画像とテンプレート画像の間を探してみます。と を使用OpenCV
してc++
います。まずSURF
、画像とテンプレートの記述子を見つけるために使用します。次にFlannBasedMatcher
、マッチポイントを取得するために使用します。すべてがうまくいっているように見えましたが、このプログラムを画像ごとに単独で実行すると、すべてのシーン画像に対して実行した場合と結果が異なります。
Ptr<FlannBasedMatcher> matcher = FlannBasedMatcher::create();
vector<DMatch> matches;
matcher->match(objectDescriptor, sceneDescriptor, matches);
double max_dist = 0, min_dist = DBL_MAX;
for (int i = 0; i < objectDescriptor.rows; i++)
{
double dist = matches[i].distance;
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
}
vector< DMatch > goodMatches;
for (int i = 0; i < objectDescriptor.rows; i++)
{
if (matches[i].distance < max((coeffGoodMatches * min_dist), maxDistanceMatches))
{
goodMatches.push_back(matches[i]);
}
}
vector<Point2f> obj;
vector<Point2f> scene;
for (int i = 0; i < goodMatches.size(); i++)
{
//-- Get the keypoints from the good matches
obj.push_back(keypoints_object[goodMatches[i].queryIdx].pt);
scene.push_back(keypoints_scene[goodMatches[i].trainIdx].pt);
}
Mat H = findHomography(obj, scene, CV_RANSAC);
Mat result;
warpPerspective(img_scene, result, H, img_object.size(), WARP_INVERSE_MAP);
SURF
どのシナリオでもキーポイントとディスクリプタは同じですがFlannBasedMatcher
、ディスクリプタを一致させようとすると、結果が異なります。以下のようにクリアも試みますが、クリアFlannBasedMatcher
しなくても結果は同じです。
matcher->clear();
何か案が?