匹配特征点以及筛选

代码

#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})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章