Я хочу выполнить сопоставление между изображениями, я использовал SIFT в качестве функции и использую RANSAC для улучшения сопоставления. Некоторые результаты хорошие, некоторые - нет. Может кто-нибудь подскажет, как это улучшить? Я думаю, что моя реализация должна быть правильной, так как я получил хорошие результаты.
Шаги, которые я выполняю в эксперименте:
Шаг 1: извлеките функцию SIFT;
Шаг 2: используйте FlannBasedMatcher для сопоставления;
Шаг 3: используйте RANSAC, чтобы исправить соответствие;
Ниже приведен основной код моего эксперимента:
FlannBasedMatcher matcher;
std::vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches );
double max_dist = 0;
double min_dist = 100;
for( int i = 0; i < descriptors_1.rows; i++ )
{
double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
for( int i = 0; i < descriptors_1.rows; i++ )
{
if( matches[i].distance < max_dist)
{
good_matches.push_back( matches[i]); //keep all the matches
}
}
H = findHomography( tmp_obj, tmp_scene, CV_RANSAC, 3.0, Mask);
for (int i = 0; i< good_matches.size(); i ++)
{
if (Mask.at<uchar>(i) != 0) // RANSAC selection
{
obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
good_matches2.push_back(good_matches[i]);
numGood = numGood + 1;
}
}
Некоторые неудачные случаи:
Соответствующее изображение 1:
Соответствующее изображение 2:
if( matches[i].distance < max_dist)
это не кажется правильным. это должно быть что-то вродеif( matches[i].distance < 3*min_dist)
. Еще один способ сделать его более надежным - применить перекрестную проверку. Вы можете выполнить полное сопоставление другой функции от второго набора к первому, и будут действительны только те пары с одинаковыми совпадениями в обоих направлениях. Это можно сделать с помощьюcv::BFMatcher
. Проверьте это и позвольте мне опубликовать ответ, если это так. - person Hamid Bazargani   schedule 16.04.2015