SIFT 特征检测及匹配
#<opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>//using namespace cv::features2d;
using namespace std;
using namespace cv;
// 计算图像的SIFT特征及匹配
float cacSIFTFeatureAndCompare(cv::Mat srcImage1,cv::Mat srcImage2, float paraHessian)
{CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL);// 转换为灰度cv::Mat grayMat1, grayMat2;cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY);cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY);// 初始化SIFT检测描述子cv::Ptr<Feature2D> sift = xfeatures2d::SIFT::create();// 关键点及特征描述矩阵声明vector<cv::KeyPoint> keyPoints1, keyPoints2;cv::Mat descriptorMat1, descriptorMat2;sift->detectAndCompute(grayMat1, Mat(), keyPoints1, descriptorMat1);sift->detectAndCompute(grayMat2, Mat(), keyPoints2, descriptorMat2);float result = 0;// 特征点匹配if (keyPoints1.size() > 0 && keyPoints2.size() > 0){// 计算特征匹配点cv::FlannBasedMatcher matcher;vector< cv::DMatch > matches;std::vector<cv::DMatch> viewMatches;matcher.match(descriptorMat1, descriptorMat2, matches);// 最优匹配判断double minDist = 100;for (int i = 0; i < matches.size(); i++){if (matches[i].distance < minDist)minDist = matches[i].distance;}// 计算距离特征符合要求的特征点int num = 0;std::cout << "minDist: " << minDist << std::endl;for (int i = 0; i < matches.size(); i++){// 特征点匹配距离判断if (matches[i].distance <= 2 * minDist){result += matches[i].distance * matches[i].distance;viewMatches.push_back(matches[i]);num++;}}// 匹配度计算result /= num;// 绘制特征点匹配结果cv::Mat matchMat;cv::drawMatches(srcImage1, keyPoints1,srcImage2, keyPoints2, matches, matchMat);cv::imshow("matchMat", matchMat);cv::waitKey(0);}return result;
}
int main()
{// 读取源图像及待匹配图像cv::Mat srcImage1 =cv::imread("Brox_Effect_000012.jpg", 1);if (srcImage1.empty())return -1;cv::Mat srcImage2 =cv::imread("Brox_Effect_000013.jpg", 1);if (srcImage2.empty())return -1;float matchRate = cacSIFTFeatureAndCompare(srcImage1, srcImage2, 1000);std::cout << "matchRate: " << matchRate << std::endl;return 0;
}
转载:http://blog.csdn.net/zhuwei1988
SIFT 特征检测及匹配相关推荐
- sift特征检测与匹配
文章目录 一 实验背景 1.sift算法介绍 1.1sift算法特点 1.2sift算法可以解决的问题 1.3 sift算法实现具体步骤 2.关键点相关概念 2.1关键点(特征点) 2.2尺度空间 3 ...
- SIFT特征检测与特征匹配
在网上的查到的代码大多是基于opencv2.4.9的特征检测算法,由于sift特征检测算法申请了专利,使得到了3.x版本以后需要配置contribe,但是以前的代码也是需要进行相应的转换. 下面的代码 ...
- 数字图像处理学习笔记(一):特征检测和匹配概述
数字图像处理学习笔记(一):特征检测和匹配概述 参考博客: 特征点的匹配 SIFT特征详解 数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法 1.特征点概述 如何高效且准确的匹配出两个不同 ...
- OpenCV图像特征提取学习四,SIFT特征检测算法
一.SIFT特征检测概述 SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的.SIFT特征具有对旋转.尺度 ...
- OpenCV + CPP 系列(卅五)图像特征提取(SURF特征检测、SIFT特征检测)
文章目录 一.SIFT特征检测 二.SURF特征检测 演示SURF.SIFT特征检测 OpenCV-python 角点特征检测之二(SIFT.SURF.ORB) 一.SIFT特征检测 SIFT(Sca ...
- SIFT地理特征匹配
SIFT算法 1.1 概述 SIFT(Scale-Invariant Feature Transform,尺度不变特征变换),由David G.Lowe提出,是一种计算机视觉的算法.它用来侦测与描述影 ...
- OpenCV基础(23)特征检测与匹配
图像的8x8像素部分被考虑,并将这个 8x8 框进一步划分为 4 个块,每个块为 4x4 维度.在每个 4x4 块内,图像梯度以向量的形式表示.通过搜索最独特或不同的特征在图像中找到关键点.这里,Ke ...
- 烟雾环境下对RGB图SIFT特征提取,匹配及深度图有效值的影响
烟雾环境下对RGB图SIFT特征提取,匹配及深度图有效值的影响 文章目录 烟雾环境下对RGB图SIFT特征提取,匹配及深度图有效值的影响 1 环境配置 1.1 opencv_contrib 1.2 M ...
- matlab特征检测,sift特征检测的matlab程序实现
[实例简介] sift特征检测的matlab程序实现,多个matlab程序,详细注释,外带试验数据 [实例截图] [核心代码] SIFT_Matlab └── SIFT_YantaoNoemie ├─ ...
最新文章
- python小项目实例流程-python实现的简单RPG游戏流程实例
- 【光斑定位】空间激光通信、光斑定位、CCD、光斑定位——13000字
- CodeForces 651B
- 去年买彩票中了400多万
- java设置绝对布局_浅谈Java绝对布局 原创
- activate-power-mode效果实验(未完全成功)
- C++笔记----运算符重载
- C++STL源码剖析之vector
- jquery+baidu map api 仿安居客地图找房源(基于百度地图)
- selenium 模拟火狐浏览器
- 多目标跟踪(Multi-Object-Tracking)入门
- bin code led_一种led颜色BIN划分方法与流程
- TCP的四次挥手为什么需要2MSL ?
- 汇佳学校|多元艺术+探究式思维 领航国际艺术教育新趋势
- 解读常见传感器的CFA排列(彩色滤色矩阵,Color Filter Array)
- 知识表示的方法(2)——框架表示法
- 扇贝python骗局_北斗揭獐子岛扇贝骗局:27条采捕船数万航行数据还原轨迹
- 【vue2】子组件向父组件传参方法汇总
- python——常用的数学计算公式
- js提取JSON数据中需要的那部分数据