ORB特征原理:http://blog.csdn.net/quincuntial/article/details/50461715
/*
*@function ORB_Detect.cpp
*@brief 使用ORB特征对目标进行检测和匹配
*@author ltc
*@date 14:45 Thursday,December 3rd,2015
*/
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\features2d\features2d.hpp>
#include<opencv2\calib3d\calib3d.hpp>
#include<iostream>
using namespace std;
using namespace cv;
vector<DMatch> ransac(vector<KeyPoint> queryKeyPoint,vector<KeyPoint> trainKeyPoint,vector<DMatch> matches);
int main(int argc,char* argv[])
{
Mat queryImage,trainImage;
queryImage=imread("4.jpg",IMREAD_COLOR);
trainImage=imread("3.jpg",IMREAD_COLOR);
ORB orb;
vector<KeyPoint> queryKeyPoint,trainKeyPoint;
Mat queryDescriptor,trainDescriptor;
orb(queryImage,Mat(),queryKeyPoint,queryDescriptor);
orb(trainImage,Mat(),trainKeyPoint,trainDescriptor);
drawKeypoints(queryImage,queryKeyPoint,queryImage);
drawKeypoints(trainImage,trainKeyPoint,trainImage);
cout<<queryKeyPoint.size()<<endl;
cout<<trainKeyPoint.size()<<endl;
imshow("query",queryImage);
imshow("train",trainImage);
//NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2
BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(queryDescriptor,trainDescriptor,matches);
vector<DMatch> ransac_matches;
ransac_matches=ransac(queryKeyPoint,trainKeyPoint,matches);
Mat image_match;
// drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,matches,image_match);
drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,ransac_matches,image_match);
imshow("image_match",image_match);
waitKey(0);
return 0;
}
vector<DMatch> ransac(vector<KeyPoint> queryKeyPoint,vector<KeyPoint> trainKeyPoint,vector<DMatch> matches)
{
vector<DMatch> ransac_matches;
vector<Point2f> queryPoint(matches.size()),trainPoint(matches.size());
for(int i=0;i<matches.size();i++)
{
queryPoint[i]=queryKeyPoint[matches[i].queryIdx].pt;
trainPoint[i]=trainKeyPoint[matches[i].trainIdx].pt;
}
vector<unsigned char> inlierMask(matches.size());
Mat H=findHomography(queryPoint,trainPoint,RANSAC,3,inlierMask);
for(size_t i=0;i<inlierMask.size();i++)
{
if(inlierMask[i])
{
ransac_matches.push_back(matches[i]);
}
}
return ransac_matches;
}
匹配结果: