匹配特征点以及筛选
代码
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/features2d/features2d.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<chrono>
using namespace std;
using namespace cv;
int main(int argc,char **argv){
    if(argc!=3){
        cout<<"usage: feature_extraction img1 img2"<<endl;
        return 1;
    }
    //读取图像
    Mat img_1=imread(argv[1],CV_LOAD_IMAGE_COLOR);
    Mat img_2=imread(argv[2],CV_LOAD_IMAGE_COLOR);
    assert(img_1.data!=nullptr&&img_2.data!=nullptr);
    //初始化
    std::vector<KeyPoint>keypoints_1,keypoints_2;
    Mat descriptors_1,descriptors_2;
    Ptr<FeatureDetector>detector=ORB::create();
    Ptr<DescriptorExtractor>descriptor=ORB::create();
    Ptr<DescriptorMatcher>matcher=DescriptorMatcher::create("BruteForce-Hamming");
    //第一步,检测Oriented FAST角点位置
    detector->detect(img_1,keypoints_1);
    detector->detect(img_2,keypoints_2);
    //第二步,根据角点位置计算BRIEF描述子
    descriptor->compute(img_1,keypoints_1,descriptors_1);
    descriptor->compute(img_2,keypoints_2,descriptors_2);
    Mat outimg1;
    drawKeypoints(img_1,keypoints_1,outimg1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);
    imshow("ORB feature",outimg1);
    //第三步,对两幅图像中的BRIEF描述子进行匹配,使用Hamming距离
    vector<DMatch>matches;
    matcher->match(descriptors_1,descriptors_2,matches);
    //第四步:匹配点对筛选
    //计算最小距离和最大距离
    auto min_max=minmax_element(matches.begin(),matches.end(),[](const DMatch &m1,const DMatch &m2){
        return m1.distance<m2.distance;
    });
    double min_dist=min_max.first->distance;
    double max_dist=min_max.second->distance;
    printf("-- Max dist : %f \n ",max_dist);
    printf("-- Min dist : %f \n ",min_dist);
    //当描述子之间的距离大于两倍的最小距离时,即认为匹配有误,但有时最小距离会非常小,所以设置一个30的经验值作为下限
    std::vector<DMatch>good_matches;
    for(int i=0;i<descriptors_1.rows;i++){
        if(matches[i].distance<=max(2*min_dist,30.0)){
            good_matches.push_back(matches[i]);
        }
    }
    //第五步,绘制匹配结果
    Mat img_match;
    Mat img_goodmatch;
    drawMatches(img_1,keypoints_1,img_2,keypoints_2,matches,img_match);
    drawMatches(img_1,keypoints_1,img_2,keypoints_2,good_matches,img_goodmatch);
    imshow("all matches",img_match);
    imshow("good matches",img_goodmatch);
    waitKey(0);
    return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(ch7)
#OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(orb_cv orb_cv.cpp)
target_link_libraries(orb_cv ${OpenCV_LIBS})

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号