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

简介: SIFT配合暴力匹配进行关键点描述和提取

接上一篇图片匹配教程

此处为语雀内容卡片,点击链接查看:https://developer.aliyun.com/article/978422?spm=a2c6h.13148508.setting.20.20cb4f0e3oNmeo

和上次ORB对比一下

上次的效果

本次的效果


上次的效果


本次的效果


可以说比上次好的多得多

测试环境

win10

visual studio 2019

opencv-3.4.3

opencv_contrib-3.4.3

cmake 3.20.3

备注


2021年3月6日,已满20年,专利权已经到期!SIFT已经成为全人类的公共技术,任何人和组织都可以免费使用!

opencv4.5.2已将sift移入主库


sift是有专利的算法, cmake编译时需要勾选 OPENCV_ENABLE_NONFREE, 才能使用有专利的算法

opencv源码编译可参考该视频教程:

vs2019+opencv3.4.6+contrib3.4.6源码编译


测试源码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/features2d/features2d.hpp>
#include<opencv2/xfeatures2d/nonfree.hpp>
using namespace std;
using namespace cv;
int main()
{
  Mat trainImage = imread("D:/script/myGit/autojs-flann-feature-matching/图片素材/game001.png"), trainImage_gray;
  //imshow("trainImage", trainImage);
  cvtColor(trainImage, trainImage_gray, COLOR_BGR2GRAY);
  vector<KeyPoint>train_keyPoint;
  Mat trainDescription;
  //SiftFeatureDetector featureDetector;
  //featureDetector.detect(trainImage_gray, train_keyPoint);
  Ptr<xfeatures2d::SiftFeatureDetector> featureDetector = xfeatures2d::SiftFeatureDetector::create();
  featureDetector->detect(trainImage_gray, train_keyPoint);
  Ptr<xfeatures2d::SiftDescriptorExtractor> featureExtractor = xfeatures2d::SiftDescriptorExtractor::create();
  featureExtractor->compute(trainImage_gray, train_keyPoint, trainDescription);
  BFMatcher matcher;
  vector<Mat>train_desc_collection(1, trainDescription);
  matcher.add(train_desc_collection);
  matcher.train();
  Mat captureImage, captureImage_gray;
  captureImage = imread("D:/script/myGit/autojs-flann-feature-matching/图片素材/game001_女生头像.png");
  cvtColor(captureImage, captureImage_gray, COLOR_BGR2GRAY);
  vector<KeyPoint>test_keyPoint;
  Mat testDescriptor;
  featureDetector->detect(captureImage_gray, test_keyPoint);
  featureExtractor->compute(captureImage_gray, test_keyPoint, testDescriptor);
  vector<vector<DMatch>>matches;
  matcher.knnMatch(testDescriptor, matches, 2);
  vector<DMatch>goodMatches;
  for (unsigned int i = 0; i < matches.size(); i++)
  {
    if (matches[i][0].distance < 0.6 * matches[i][1].distance)
      goodMatches.push_back(matches[i][0]);
  }
  Mat dstImage;
  drawMatches(captureImage, test_keyPoint, trainImage, train_keyPoint, goodMatches, dstImage);
  imshow("dstImage", dstImage);
  cv::waitKey(0);
  return 0;
}


参考文章

源代码(《OpenCV3编程入门》综合示例:SIFT配合暴力匹配进行关键点描述和提取)


vs2019装opencv3.4.2cmake报错

Visual Studio 版本 与 MSVC 编译器 版本

opencv3 中的 SIFT 用法

Visual Studio 2019 重新生成 OpenCV 解决方案报 LNK2019 无法解析的外部符号 __imp__Py_NegativeRefcount、__imp_Py_RefTotal

win10下用 Visual Studio 2019 重新生成 OpenCV 解决方案报 LNK1104 无法打开文件 “python38_d.lib”

CMake编译OpenCV4.0时opencv_ffmpeg.dll等下载失败的解决思路总结

OpenCV – 3.4.3

OpenCV - Windows(win10)编译opencv + opencv_contrib

声明

部分内容来自网络

本教程仅用于学习, 禁止用于其他用途

相关文章
|
3月前
单词 sift 的含义和使用场景介绍
单词 sift 的含义和使用场景介绍
29 2
|
5月前
|
编解码 计算机视觉 索引
OpenCV使用单目标匹配从图像中选择最佳的匹配结果及查找重复图像实战(附Python源码)
OpenCV使用单目标匹配从图像中选择最佳的匹配结果及查找重复图像实战(附Python源码)
82 0
|
3月前
|
机器学习/深度学习 网络架构 计算机视觉
YOLOv5改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (附代码 + 详细修改教程)
YOLOv5改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (附代码 + 详细修改教程)
105 3
|
移动开发 文字识别 算法
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
本文简要介绍Pattern Recognition 2019论文“SegLink++: Detecting Dense and Arbitrary-shaped Scene Text by Instance-aware Component Grouping”的主要工作。该论文提出一种对文字实例敏感的自下而上的文字检测方法,解决了自然场景中密集文本和不规则文本的检测问题。
1876 0
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
|
5月前
|
机器学习/深度学习 文字识别 算法
[Halcon&图像] 缺陷检测的一些思路、常规检测算法
[Halcon&图像] 缺陷检测的一些思路、常规检测算法
405 1
|
3月前
|
算法 Go 区块链
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
25 0
|
5月前
|
算法
[Halcon&定位] 形状匹配和灰度匹配对比
[Halcon&定位] 形状匹配和灰度匹配对比
91 0
|
9月前
|
JSON 算法 数据格式
优化cv2.findContours()函数提取的目标边界点,使语义分割进行远监督辅助标注
可以看到cv2.findContours()函数可以将目标的所有边界点都进行导出来,但是他的点存在一个问题,太过密集,如果我们想将语义分割的结果重新导出成labelme格式的json文件进行修正时,这就会存在点太密集没有办法进行修改,这里展示一个示例:没有对导出的结果进行修正,在labelme中的效果图。
88 0
|
算法 固态存储
分别使用SAD匹配,NCC匹配,SSD匹配三种算法提取双目图像的深度信息
分别使用SAD匹配,NCC匹配,SSD匹配三种算法提取双目图像的深度信息
114 0
分别使用SAD匹配,NCC匹配,SSD匹配三种算法提取双目图像的深度信息