使用FLANN进行特征点匹配


目标

在本教程中我们将涉及以下内容:



使用 FlannBasedMatcher​ 接口以及函数 FLANN 实现快速高效匹配( 快速最近邻逼近搜索函数库(Fast Approximate Nearest Neighbor Search Library) )



理论



代码

这个教程的源代码如下所示。​


#include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.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 );    //-- Step 2: Calculate descriptors (feature vectors)   SurfDescriptorExtractor extractor;    Mat descriptors_1, descriptors_2;    extractor.compute( img_1, keypoints_1, descriptors_1 );   extractor.compute( img_2, keypoints_2, descriptors_2 );    //-- Step 3: Matching descriptor vectors using FLANN matcher   FlannBasedMatcher matcher;   std::vector< DMatch > matches;   matcher.match( descriptors_1, descriptors_2, matches );    double max_dist = 0; double min_dist = 100;    //-- Quick calculation of max and min distances between keypoints   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;   }    printf("-- Max dist : %f \n", max_dist );   printf(