簡體   English   中英

基於FlannBasedMatcher的SURF特征提取和關鍵點匹配

[英]SURF Feature extraction and Keypoint match based on FlannBasedMatcher

以下是我的代碼,用於使用SURF提取特征,並使用flannBasedMatcher匹配點。

Mat object = imread("S6E0.bmp",  CV_LOAD_IMAGE_GRAYSCALE);

    if( !object.data )
    {
    // std::cout<< "Error reading object " << std::endl;
    return -2;
    }

    //Detect the keypoints using SURF Detector

    int minHessian = 500;

    SurfFeatureDetector detector( minHessian );

    std::vector<KeyPoint> kp_object;

    detector.detect( object, kp_object );

    //Calculate descriptors (feature vectors)
    SurfDescriptorExtractor extractor;

    Mat des_object;

    extractor.compute( object, kp_object, des_object );

    FlannBasedMatcher matcher;
    char key = 'a';
    //VideoCapture cap(0);

    namedWindow("Good Matches");

    std::vector<Point2f> obj_corners(4);

    //Get the corners from the object
    obj_corners[0] = cvPoint(0,0);
    obj_corners[1] = cvPoint( object.cols, 0 );
    obj_corners[2] = cvPoint( object.cols, object.rows );
    obj_corners[3] = cvPoint( 0, object.rows );

    Mat image = imread("S6E0.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    Mat des_image, img_matches;

    std::vector<KeyPoint> kp_image;
    std::vector<vector<DMatch >> matches;

    std::vector<std::vector<cv::DMatch>> matches1;
    std::vector<std::vector<cv::DMatch>> matches2;
    std::vector<cv::DMatch> matches3;
    std::vector<DMatch > good_matches;
    std::vector<Point2f> obj;
    std::vector<Point2f> scene;

    std::vector<Point2f> scene_corners(4);

    Mat H;

    //cvtColor(frame, image, CV_RGB2GRAY);
    detector.detect( image, kp_image );
    extractor.compute( image, kp_image, des_image );


    matcher.knnMatch(des_object, des_image, matches, 2);



    for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
    {
        if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
        {
            good_matches.push_back(matches[i][0]);
        }
    }

        //Draw only "good" matches

    drawMatches( object, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

    if (good_matches.size() >= 4)
    {
        printf("Images matching %d , %d", good_matches.size(), kp_object.size());

        //return 1;

        for( int i = 0; i < good_matches.size(); i++ )
        {

            //Get the keypoints from the good matches

            obj.push_back( kp_object[ good_matches[i].queryIdx ].pt );
            scene.push_back( kp_image[ good_matches[i].trainIdx ].pt );
        }

        //H = findHomography( obj, scene, CV_RANSAC );
        //printf("Size : %d", H.size());
        //perspectiveTransform( obj_corners, scene_corners, H);
        //printf("Size : %d --- %d --- %d", H.size(), scene_corners.size()); 

    }else{

        printf("Images matching %d , %d", good_matches.size(), kp_object.size());
    }

        //Show detected matches

    imshow( "Good Matches", img_matches );
    waitKey(0);
    return 0;

在這段代碼中,我想知道通過這種方法究竟發生了什么

matcher.knnMatch(des_object, des_image, matches, 2);

據我所知,我傳遞了匹配圖像的兩個描述符, 匹配向量用2個最近鄰居填充。 我想知道方法中究竟發生了什么,以及如何填充匹配方法以及填充哪些點。

在此代碼段中

for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
    {
        if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
        {
            good_matches.push_back(matches[i][0]);
        }
    }

我使用最近的neibour距離比(nndr)為0.6,我想知道如何找出good_matches以及nndr值的變化將如何影響。

如果我可以解決這個代碼,那將是一個很大的幫助。 謝謝。

FlannBasedMatcher基於Muja 等人撰寫的論文 人。 ; 你可以找到確切的算法以及它們如何在那里進行..

關於good_matches ,你只是在代碼片段中看到它是你的結果基於標准的最佳匹配的集合,即nndr ..它基本上是一個閾值,決定在放棄之前允許匹配的距離。完全匹配..更高的閾值,更多的點被考慮,更多的是積極匹配的數量(無論它們是否為真,將由您的數據集和您設置nndr級別的方式決定)。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM