代碼
#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})