SIFT算法的特征提取与匹配
2015-12-22 22:37
330 查看
借鉴作者http://licong1018.blog.163.com/blog/static/902697842012111594813944/的程序,我用自己的图片尝试一下果然好用,img1/img2是同一个物体的不同形状图片,算法的步骤很简洁,注释部分是我依据自己的理解添加进去的,可能理解的有些偏差,望指教。
#include "highgui.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat input1 = imread("img1.png", 1);
Mat input2 = imread("img2.png", 1);
SiftFeatureDetector detector;//SIFT的特征探测器;
vector<KeyPoint> keypoint1, keypoint2;
detector.detect(input1, keypoint1);//keypoint存储了检测到特征点的基本信息;
Mat output1;//提取图片特征并显示出来;
drawKeypoints(input1, keypoint1, output1);
imshow("sift_result1.png", output1);
imwrite("sift_result1.png", output1);
Mat output2;
SiftDescriptorExtractor extractor;//存储SIFT提取的特征向量
Mat descriptor1, descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;//提取图片特征函数并显示
detector.detect(input2, keypoint2);
drawKeypoints(input2, keypoint2, output2);
imshow("sift_result2.jpg", output2);
imwrite("sift_result2.jpg", output2);
//计算两幅图像的特征向量
extractor.compute(input1, keypoint1, descriptor1);
extractor.compute(input2, keypoint2, descriptor2);
//两组特征向量匹配;
matcher.match(descriptor1, descriptor2, matches);
//匹配结果的图像存储到img_matches;
drawMatches(input1, keypoint1, input2, keypoint2, matches, img_matches);
imshow("matches", img_matches);
imwrite("matches.jpg", img_matches);
cvWaitKey(100);
return 0;
}
#include "highgui.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat input1 = imread("img1.png", 1);
Mat input2 = imread("img2.png", 1);
SiftFeatureDetector detector;//SIFT的特征探测器;
vector<KeyPoint> keypoint1, keypoint2;
detector.detect(input1, keypoint1);//keypoint存储了检测到特征点的基本信息;
Mat output1;//提取图片特征并显示出来;
drawKeypoints(input1, keypoint1, output1);
imshow("sift_result1.png", output1);
imwrite("sift_result1.png", output1);
Mat output2;
SiftDescriptorExtractor extractor;//存储SIFT提取的特征向量
Mat descriptor1, descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;//提取图片特征函数并显示
detector.detect(input2, keypoint2);
drawKeypoints(input2, keypoint2, output2);
imshow("sift_result2.jpg", output2);
imwrite("sift_result2.jpg", output2);
//计算两幅图像的特征向量
extractor.compute(input1, keypoint1, descriptor1);
extractor.compute(input2, keypoint2, descriptor2);
//两组特征向量匹配;
matcher.match(descriptor1, descriptor2, matches);
//匹配结果的图像存储到img_matches;
drawMatches(input1, keypoint1, input2, keypoint2, matches, img_matches);
imshow("matches", img_matches);
imwrite("matches.jpg", img_matches);
cvWaitKey(100);
return 0;
}
相关文章推荐
- Python-OpenCV:sift(),SURF() 特征提取
- SIFT特征提取:SIFT Feature Extraction
- 特征提取— —SIFT算法
- 2.SIFT特征提取分析的学习
- SIFT特征提取
- 监督学习之Logistic regression——Andrew Ng机器学习笔记(二)
- CC学习C语言 小结No.1
- 双缓存解决闪烁及对话框背景覆盖控件问题
- js刷新页面的几种方法
- 关于 Storm 的一篇好文章
- tomcat的一些知识
- android studio使用
- C#中的委托和事件(续)
- Windows10+Caffe+CUDA7.5+VS2013环境配置
- 一起talk C栗子吧(第八十回:C语言实例--进程互斥)
- 【WIN10】WIN2D——圖像處理
- [HDU1210] Eddy's 洗牌问题
- 给你看看我练习的oracle语句
- 第三天
- PHP批量导入excel数据到数据库简易版方法(From Jeskitt)