opencv3中SIFT配合暴力匹配进行关键点描述和提取
2015-11-21 23:41
489 查看
#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; }
相关文章推荐
- opencv3中ORB算法描述与匹配
- opencv3中FLANN结合SURF进行关键点的描述和匹配
- 练习--LINUX进程间通信之信号SIGNAL
- 查看linux的IP地址
- Office 365 Service Communications API operations--Get Messages
- Office 365 Service Communications API operations--Get Historical Status
- OpenCV中特征点提取和匹配的通用方法
- Office 365 Service Communications API operations--Get Current Status
- OpenCV2:特征匹配及其优化
- Office 365 Service Communications API operations--Get Services
- Photoshop CS6自学(一)认识
- eclipse学习bash shell 的插件 DLTK
- CentOS7安装phpMyAdmin
- 文章标题
- CentOS 快速安装pip
- CMFCPropertySheet和CMFCPropertyPage增强用法
- Tomcat开启shtml
- login shell和non-login shell
- django1.9.1+apache24+mod_wsgi详解(win)
- centos6.5下安装mysql