本文共 1988 字,大约阅读时间需要 6 分钟。
#include#include #include #include #include #include using namespace std;using namespace cv;vector ransac(vector queryKeyPoint,vector trainKeyPoint,vector matches);int main(int argc,char* argv[]){ //定义图像 Mat queryImage,trainImage; //读取图像 queryImage = imread("3.jpg",IMREAD_COLOR); trainImage = imread("4.jpg",IMREAD_COLOR); //判断是否读取图像 if(queryImage.empty() || trainImage.empty()) { cerr<<"Failure in loading image"< queryKeyPoint,trainKeyPoint; //检测surf特征 surfDetector.detect(queryImage,queryKeyPoint); surfDetector.detect(trainImage,trainKeyPoint); //查看检测到的特征点的数目 cout<<"Number of queryKeyPoint:"< < bfMatches; vector flannMatches; //Brute Match,穷举法求最近邻 BFMatcher bfMatcher; bfMatcher.match(queryDescriptor,trainDescriptor,bfMatches); //FlannBasedMatcher,最近邻近似匹配 FlannBasedMatcher flannMatcher; flannMatcher.match(queryDescriptor,trainDescriptor,flannMatches); //对匹配点进行RANSAC过滤 vector ransac_BFMatches,ransac_FlannMatches; ransac_BFMatches=ransac(queryKeyPoint,trainKeyPoint,bfMatches); ransac_FlannMatches=ransac(queryKeyPoint,trainKeyPoint,flannMatches); //定义匹配图像 Mat bfMatchImage,flannMatchImage; //绘制匹配图像 //drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,bfMatches,bfMatchImage); //drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,flannMatches,flannMatchImage); drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,ransac_BFMatches,bfMatchImage); drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,ransac_FlannMatches,flannMatchImage); //显示匹配结果 imshow("BFMatch",bfMatchImage); imshow("FlannMatch",flannMatchImage); waitKey(0); return 0;}vector ransac(vector queryKeyPoint,vector trainKeyPoint,vector matches){ cout<<"ransac前:"< < queryPoints(matches.size()),trainPoints(matches.size()); for(int i=0;i inlierMask(matches.size()); vector ransac_matches; H = findHomography(queryPoints,trainPoints,CV_RANSAC,3,inlierMask); for(int i=0;i
SURF原理:
匹配结果: