特征检测属于 opencv_contrib 库,在编译 OpenCV 时包含了附加模块才能使用,具体如何编译这里就不再作说明了

一、创建检测器

首先读取要建立提取特征的图像与存放特征点的数组

cv::Mat image = cv::imread("hy.jpg", 1);
std::vector<cv::KeyPoint>keypoints;

使用特征检测方法之前,要创建检测器,然后调用它的检测方法,例如

1、FAST

// FAST 特征检测器,阈值为 40
cv::Ptr<cv::FastFeatureDetector> ptrFAST =cv::FastFeatureDetector::create(40);
// 检测关键点
ptrFAST->detect(image,keypoints);

2、SURF

// 创建 SURF 特征检测器对象
cv::Ptr<cv::xfeatures2d::SurfFeatureDetector> ptrSURF =cv::xfeatures2d::SurfFeatureDetector::create(2000.0);// 检测关键点
ptrSURF->detect(image, keypoints);

3、SIFT

// 构建 SIFT 特征检测器实例
cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> ptrSIFT =cv::xfeatures2d::SiftFeatureDetector::create();
// 检测关键点
ptrSIFT->detect(image, keypoints);

4、BRISK

// 构造 BRISK 特征检测器对象
cv::Ptr<cv::BRISK> ptrBRISK = cv::BRISK::create();
// 检测关键点
ptrBRISK->detect(image, keypoints);

5、ORB

// 构造 ORB 特征检测器对象
cv::Ptr<cv::ORB> ptrORB =cv::ORB::create(75, // 关键点的总数1.2, // 图层之间的缩放因子8); // 金字塔的图层数量
// 检测关键点
ptrORB->detect(image, keypoints);

二、特征匹配

五种方法的使用都非常相似,接下来给出一个具体的例子

1、画图函数

cv::drawMatches(image1, keypoints1, // 第一幅图像image2, keypoints2, // 第二幅图像matches, // 匹配项的向量matchImage,//最终图像cv::Scalar(255, 255, 255), // 线条颜色cv::Scalar(255, 255, 255)); // 点的颜色

2、匹配

std::vector<cv::DMatch> matches; //存放匹配关系

这里将主要几条语句拿出来看,建议直接看下边源码注释

//patch1、patch2是两幅图片特征点附近的一块矩形区域,两者进行比较,
//结果存放在result中
cv::matchTemplate(patch1, patch2, result, cv::TM_SQDIFF);

三、示例

int main()
{cv::Mat image = cv::imread("hy.jpg", 1);cv::pyrDown(image, image);cv::Mat image1 = image.clone();cv::Mat image2 = image.clone();cv::Ptr<cv::FeatureDetector> ptrDetector; // 泛型检测器指针ptrDetector = // 这里选用 FAST 检测器cv::FastFeatureDetector::create(80);// 检测关键点std::vector<cv::KeyPoint>keypoints1, keypoints2;ptrDetector->detect(image1, keypoints1);ptrDetector->detect(image2, keypoints2);const int nsize(11); // 邻域的尺寸cv::Rect neighborhood(0, 0, nsize, nsize); // 11×11cv::Mat patch1;cv::Mat patch2;cv::Mat result;std::vector<cv::DMatch> matches;for (int i = 0; i < keypoints1.size(); i++) {// 定义图像块neighborhood.x = keypoints1[i].pt.x - nsize / 2;neighborhood.y = keypoints1[i].pt.y - nsize / 2;if (neighborhood.x < 0 || neighborhood.y < 0 ||neighborhood.x + nsize >= image1.cols ||neighborhood.y + nsize >= image1.rows)continue;patch1 = image1(neighborhood);cv::DMatch bestMatch;for (int j = 0; j < keypoints2.size(); j++) {// 定义图像块neighborhood.x = keypoints2[j].pt.x - nsize / 2;neighborhood.y = keypoints2[j].pt.y - nsize / 2;// 如果邻域超出图像范围,就继续处理下一个点if (neighborhood.x < 0 || neighborhood.y < 0 ||neighborhood.x + nsize >= image2.cols ||neighborhood.y + nsize >= image2.rows)continue;// 第二幅图像的块patch2 = image2(neighborhood);// 匹配两个图像块cv::matchTemplate(patch1, patch2, result, cv::TM_SQDIFF);// 检查是否为最佳匹配if (result.at<float>(0, 0) < bestMatch.distance) {bestMatch.distance = result.at<float>(0, 0);bestMatch.queryIdx = i;bestMatch.trainIdx = j;}}// 添加最佳匹配matches.push_back(bestMatch);}//取25条相关性最强的匹配std::nth_element(matches.begin(), matches.begin() + 25, matches.end());matches.erase(matches.begin() + 25, matches.end());cv::Mat matchImage;cv::drawMatches(image1, keypoints1, // 第一幅图像image2, keypoints2, // 第二幅图像matches, // 匹配项的向量matchImage,//最终图像cv::Scalar(255, 255, 255), // 线条颜色cv::Scalar(255, 255, 255)); // 点的颜色cv::imshow("image", matchImage);cv::waitKey(0);
}

下边是匹配结果:(想更换检测器的可以按照第一部分直接将对应代码替换掉

OpenCV用FAST、SURF、SIFT、BRISK、ORB等进行特征点提取与匹配相关推荐

  1. opencv上gpu版surf特征点与orb特征点提取及匹配实例

    opencv上gpu版surf特征点与orb特征点提取及匹配实例 标签: gpu版surfgpu orbsurf和orbgpu surf及orbsurf orb gpu 2016-09-25 23:4 ...

  2. 计算机视觉与深度学习 | 使用MATLAB实现图像SURF特征的提取与匹配以及目标定位(代码类)

    了解博主更多项目查看 github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ========== ...

  3. OpenCV 尺度不变特征检测:SIFT、SURF、BRISK、ORB

    这个学期在上数字图像处理这门课.这门课没有考试,只有大作业,要求使用labwindows和NI Vision进行开发.我选的题目是全景图像的合成(图像拼接),其中要使用到一些特征点检测和匹配的算法.本 ...

  4. SURF SIFT ORB三种特征检测算法比较

    转自https://blog.csdn.net/zilanpotou182/article/details/66478915 我们知道,双目立体测距的基础是利用视差求距离,而视差就是计算左右图像中对应 ...

  5. opencv曝光算法_OpenCV特征点提取算法对比

    除了我们熟知的SIFT.SURF.ORB等特征点提取算法,OpenCV中还提供了十余种特征点提取算法.最近在整理以往的ppt和报告,看到其中一页ppt,发现已经忘得差不多了,就再写篇博客复习下好了,这 ...

  6. Opencv图像特征点提取(

    目录 特征点分类 1 ORB ①特征点检测 ②计算特征描述 2 SIFT 1 SIFT特征检测的步骤 ①.在DOG尺度空间中获取极值点,即关键点. ②.特征点方向估计 ③生成特征描述 ④.代码实现 3 ...

  7. SLAM从0到1——ORB特征提取及特征匹配

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 学习3D视觉核心技术,扫描查看介绍,3天内无条件退款 圈里有高质量教程资料.可答疑解惑.助你高效解决问 ...

  8. 特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)

    一.基本概念: 作用:特征点提取在"目标识别.图像拼接.运动 跟踪.图像检索.自动定位"等研究中起着重要作用: 主要算法: •FAST , Machine Learning for ...

  9. 几个常用有力的特征的分析LBP、HOG、FAST、SIFT/SURF、MSER、BRISK

    1.LBP LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pieti ...

最新文章

  1. metaq的简单封装dataChange解读
  2. python 字符串前面加 f
  3. Eclipse SVN插件冲突导致不能使用解决办法
  4. 【强连通分量】Proving Equivalences
  5. HTML Viewer的定制
  6. eslint检测node 内部模块报错解决方案
  7. zbb20180913 java synchronized同步静态方法和同步非静态方法的异同
  8. OpenSSH 6.7 发布 开源ssh服务器软件
  9. oracle 12c pdb开启和关闭,及设置开机自启动
  10. 怎样让AI完成人类搞不定的任务?OpenAI提出迭代扩增法给AI设目标
  11. Ubuntu学习日记--Lesson4:环境变量详解
  12. EXCEL数据组合的用法
  13. “好工作”的最关键指标:场景足够复杂、数据量足够大、杠杆率足够高
  14. 从春运迁徙图看疫情变化
  15. 百度地图线路查询路线样式自定义
  16. C++中的友元函数、static函数、常函数小结(理论篇)
  17. 我想深入学习Go语言
  18. 思维导图工具之Mindmeister
  19. Android从驱动到应用开发实例分析
  20. Excel2016 自动换行

热门文章

  1. Linux unrar命令如何按目录解压rar文件
  2. python生成6位数验证码_Python随机生成一个6位的验证码代码分享
  3. jdjjsjsjhfshafhiehf
  4. 7 个支持敏捷的开源项目管理工具,更好地管理项目
  5. echarts实现中国地图各省背景根据数值大小变化的方法
  6. 感知器算法(perceptron algorithm)
  7. 移动端网页开发(一)
  8. MacOS 苹果系统下 OBS黑屏(屏幕录制黑屏)解决办法
  9. 人脸识别考勤系统解决方案
  10. Android Studio快速集成讯飞SDK实现文字朗读功能