如何在两个图像OpenCV之间改进与RANSAC的SIFT匹配

时间:2015-01-23 10:28:32

标签: opencv image-processing object-detection object-recognition

我想在图像之间进行匹配,我使用SIFT作为功能,并使用RANSAC来改善匹配。一些结果很好,但有些失败了。谁能告诉我如何改进它?我认为我的实施应该是正确的,因为我得到了一些好的结果。

我做实验的步骤是:

Step1 :提取SIFT功能;

Step2 :使用FlannBasedMatcher进行匹配;

Step3 :使用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匹配: enter image description here

1 个答案:

答案 0 :(得分:0)

我认为问题在于,在经过匹配的功能后,您可能不会绘制匹配的功能。 我可以看到您使用ransac提取了单应性H,但是不清楚您如何用H绘制点的精炼样本。