opencv3中SIFT配合暴力匹配进行关键点描述和提取

来源:互联网 发布:袁姗姗知乎 编辑:程序博客网 时间:2024/06/06 01:48
#include<opencv2/opencv.hpp>#include<iostream>#include<vector>using namespace cv;using namespace std;int main(){Mat srcImage = imread("mofang1.jpg");imshow("【原图】", srcImage);//对BGR空间的图像直接进行计算很费时间,所以,需要转换为灰度图Mat srcGrayImage;cvtColor(srcImage, srcGrayImage, CV_BGR2GRAY);//首先对两幅图像进行特征点的检测和描述子的计算vector<KeyPoint> keyPoint1;//这里用SURF会更加快SIFT surf(2000);surf.detect(srcGrayImage, keyPoint1);Mat descriImage1;surf.compute(srcGrayImage, keyPoint1, descriImage1);//先对原图的描述子进行保留BFMatcher FLMatcher;//因为FlannBasedMatcher类的成员函数add()的参数是一个vector<Mat>的容器,所以先定义一个这样的变量,并将原图的描述子放入容器中vector<Mat> g_vdescriImage1(1, descriImage1);/*g_vdescriImage1.push_back(descriImage1);*///调用FlannBasedMatcher类的成员函数add,将原图的描述子放在FlannBasedMatcher的对象FLMatcher中FLMatcher.add(g_vdescriImage1);//...........................................................FLMatcher.train();VideoCapture capture;capture.open(0);Mat frameImage, frameGrayImage;while (waitKey(1) != 27){capture >> frameImage;//为了提高计算效率,将图像转换为灰度图像cvtColor(frameImage, frameGrayImage, CV_BGR2GRAY);//计算特征点和描述子vector<KeyPoint> keyPoints2;surf.detect(frameGrayImage, keyPoints2);Mat descriImage2;surf.compute(frameGrayImage, keyPoints2, descriImage2);//将之前得到的原图的描述子和现在得到的描述子进行匹配//成员函数knnMatch的参数是二维的DMatch向量,所以首先定义一个该容器的向量vector<vector<DMatch>> knnDMatches;//用之前已经存放原图描述子的对象来计算FLMatcher.knnMatch(descriImage2, knnDMatches, 2);//采集优秀的匹配点vector<DMatch> goodMatches;for (size_t i = 0; i < knnDMatches.size(); i++){//........................................................................if (knnDMatches[i][0].distance < 0.6 * knnDMatches[i][1].distance){goodMatches.push_back(knnDMatches[i][0]);}}Mat dstImage;drawMatches(frameImage, keyPoints2, srcImage, keyPoint1, goodMatches, dstImage);imshow("【结果图】", dstImage);}return 0;}

0 0