匹配特徵點以及篩選

代碼

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