Как улучшить сопоставление SIFT с помощью RANSAC между двумя изображениями, OpenCV

Я хочу выполнить сопоставление между изображениями, я использовал 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: www.dropbox.com/s/41thn6wdiutsjbb/case1.jpg?dl  = 0

Соответствующее изображение 2: введите описание изображения здесь


person kim    schedule 23.01.2015    source источник
comment
образец 2 полностью совместим с вычисленной гомпграфией, касающейся ransac, и будет иметь много вставок. Проблема как раз в самой омографии. Вы должны проверить наличие некоторых ограничений гомографии, например. он не преобразует все ваши точки в одну позицию;)   -  person Micka    schedule 23.01.2015
comment
вы знаете, где установить ограничения?   -  person kim    schedule 24.01.2015
comment
Вы не можете их установить. Гугл о том, как проверить качество омографии. Есть метод, который использует его определитель или что-то подобное.   -  person Micka    schedule 24.01.2015
comment
Например. попробуйте stackoverflow.com/questions/14954220/   -  person Micka    schedule 24.01.2015
comment
@ Роман Шаповалов есть предложения?   -  person kim    schedule 28.01.2015
comment
еще одна вещь, которую вы видите на обоих ваших изображениях, это то, что maaaaany ключевые точки совпадают с одной ключевой точкой на другом изображении. Вы можете легко обнаружить эти множественные совпадения и удалить их (оставьте только лучшее).   -  person Micka    schedule 28.01.2015
comment
if( matches[i].distance < max_dist) это не кажется правильным. это должно быть что-то вроде if( matches[i].distance < 3*min_dist). Еще один способ сделать его более надежным - применить перекрестную проверку. Вы можете выполнить полное сопоставление другой функции от второго набора к первому, и будут действительны только те пары с одинаковыми совпадениями в обоих направлениях. Это можно сделать с помощью cv::BFMatcher. Проверьте это и позвольте мне опубликовать ответ, если это так.   -  person Hamid Bazargani    schedule 16.04.2015


Ответы (1)


Я думаю, проблема в том, что вы могли не рисовать совпадающие объекты после того, как они прошли выкуп. Я вижу, что вы использовали ransac для извлечения гомографии H, но неясно, что вы делаете с H, чтобы нарисовать уточненную выборку точек.

person Hayley    schedule 02.08.2018