2014-12-02 127 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