2014-12-02 124 views
1

目標:通過使用Surf descriptorsopencv 2.4.9庫匹配斑點。衝浪特徵提取

算法:基於以下鏈接:Steps


#include <stdio.h> 
#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/nonfree/features2d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/nonfree/nonfree.hpp" 

using namespace cv; 

void readme(); 

/** @function main */ 
int main(int argc, char** argv) 
{ 
    if(argc != 3) 
    { readme(); return -1; } 

    Mat img_1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE); 
    Mat img_2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE); 

    if(!img_1.data || !img_2.data) 
    { std::cout<< " --(!) Error reading images " << std::endl; return -1; } 

    //-- Step 1: Detect the keypoints using SURF Detector 
    int minHessian = 400; 

    SurfFeatureDetector detector(minHessian); 

    std::vector<KeyPoint> keypoints_1, keypoints_2; 

    detector.detect(img_1, keypoints_1); 
    detector.detect(img_2, keypoints_2); 

    //-- Draw keypoints 
    Mat img_keypoints_1; Mat img_keypoints_2; 

    drawKeypoints(img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT); 
    drawKeypoints(img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT); 

    //-- Show detected (drawn) keypoints 
    imshow("Keypoints 1", img_keypoints_1); 
    imshow("Keypoints 2", img_keypoints_2); 

    waitKey(0); 

    return 0; 
    } 

    /** @function readme */ 
    void readme() 
    { std::cout << " Usage: ./SURF_detector <img1> <img2>" << std::endl; } 

結果關鍵點檢測:在下面的圖像的關鍵點的數目是非常高的,而不是許多是重要。如何選擇最能描述blob的關鍵點的最佳子集。除Surf之外還有更好的方法嗎?這些斑點是二進制 enter image description here

回答

1

較高minHessian將產生較少的關鍵點。

很難從圖像中分辨出你試圖匹配的兩個輸入圖像是什麼,你的目標究竟是什麼(將「Vos ..」的「Vo」與「Votre ...」 「是成功還是失敗?

+0

目前我不想加工這些圖像我想知道如何選擇最佳的keyPoints子集,你認爲可以得到相同結果的關鍵點越少TY – 2014-12-03 11:45:24

+1

這取決於圖像,但較弱的關鍵點通常不太可靠,關鍵點較少會使模型選擇更加可靠/可靠。其他啓發式方法可能會將圖像分割爲平鋪並選擇每個平鋪N個關鍵點(以及可能來自整個圖像的剩餘K個最強關鍵點)。您也可以放棄接近相同的關鍵點,因爲它們通常表示有紋理的區域並且難以匹配。 – 2014-12-04 12:26:14