下面我们学习特征点匹配的使用

import cv2def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止cv2.destroyAllWindows()# 第一步:先读取俩图片
imgA = cv2.imread('images/build.jpeg', 0)
imgB = cv2.imread('images/build2.png', 0)# 第二步:构造sift,求解出特征点和sift特征向量
sift = cv2.xfeatures2d.SIFT_create()
kpsA, dpA = sift.detectAndCompute(imgA, None)
kpsB, dpB = sift.detectAndCompute(imgB, None)# 第三步:构造BFMatcher()蛮力匹配(Brute-Force),匹配sift特征向量距离最近对应组分
bf = cv2.BFMatcher()# ===================================1对1的匹配
# A图像的一关键点和B图像的一关键点,互相都是对方最匹配的点。
# 获得匹配的结果,结果是一对,A图像的第 i 个kp 和 B图像的第 j 个kp一堆,匹配程度是多少,
# 匹配程度(两个128维度特征向量的近似度)用欧式距离表示,距离越小,表示越相近
matches = bf.match(dpA, dpB)# 按照匹配程度,对匹配的 对儿 排个序,
matches = sorted(matches, key=lambda x: x.distance)# 使用cv2.drawMacthes进行画图操作,这里我们只画出前30个最相近的。
ret = cv2.drawMatches(imgA, kpsA, imgB, kpsB, matches[:30], None, flags=2)cv_show_image('1_vs_1_img', ret)# ===================================K对最佳的匹配
# A图像中的某个关键点,可以在B图像中找到K的最匹配的点都保留下来。
# 假如我们取前2最匹配,
# 第一个图像有个点A,和第二个图像的有个点B最匹配,和C是次级最匹配。
# 匹配程度(两个128维度特征向量的近似度)用欧式距离表示,距离越小,表示越相近,dis(A,B)=m, dis(A,B)=n
# 我们再做个比较,如果 m < 0.75 * n 就可以取m,否则不取m,因为区分度不高,这个很模糊,不好说的。
matches = bf.knnMatch(dpA, dpB, k=2)# 完了后需要做个过滤
good_pts = []
for res in matches:m, n = resif m.distance < 0.75 * n.distance:good_pts.append([m])# 第四步:使用cv2.drawMacthes进行画图操作,这里我们只画出前30个最相近的。
ret = cv2.drawMatchesKnn(imgA, kpsA, imgB, kpsB, good_pts, None, flags=2)cv_show_image('knn_match', ret)

效果如下:
1对1匹配的结果

k对匹配的结果

很明显,K对匹配会有一些匹配错误的点,或者说是异常点,这个将大大折扣匹配效果,这个怎么消除呢?下一次的学习中将介绍方法。

【opencv学习】SIFT算法的基本使用以及特征匹配相关推荐

  1. python+openCV使用SIFT算法实现印章的总相似度检测

    python实现,使用SIFT算法和文字相似度检测算法,并使用了pyqt5做的印章相似度检测工具,还有很大优化空间,对于我这水平费了不少力气,记录一下. 首先整体流程是预建了一个印章库,包含若干张图片 ...

  2. Opencv实现Sift、Surf、ORB特征提取与匹配

    在opencv3中,这三个算子都转移到一个名为xfeature2d的第三方库中,而在opencv2中这三个算子在nonfree库中. 关于在vs下配置opencv可参考我转载的另外一篇文章.注意版本号 ...

  3. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  4. SIFT算法详解——图像特征提取与匹配

    文章目录 前言 一.建立高斯差分金字塔 1.建立高斯金字塔 2.建立高斯差分金字塔 3.建塔过程中参数的设定及相关细节问题 二.关键点(key points)位置确定 1.阈值化 2.在高斯差分金字塔 ...

  5. OpenCV + CPP 系列(卌一)图像特征匹配( FLANN 匹配)

    文章目录 一.FLANN简介 演示SURF--Flann 二.单应性矩阵 一.FLANN简介 FLANN库全称是Fast Library for Approximate Nearest Neighbo ...

  6. 学习sift算法的原理和步骤_深度学习笔记47_你也可以成为梵高_风格迁移算法的原理

    神经风格迁移 可用来干什么? 同deepDream一样是驱动图像修改的一个重大进展.可以把照片风格化,看起来就像是一幅画一样.这些为你提供非常多漂亮的艺术风格,就像是梵高所画的<星夜>. ...

  7. opencv学习笔记三十六:AKAZE特征点检测与匹配

    KAZE是日语音译过来的 , KAZE与SIFT.SURF最大的区别在于构造尺度空间,KAZE是利用非线性方式构造,得到的关键点也就更准确(尺度不变性 ): Hessian矩阵特征点检测 ,方向指定, ...

  8. opencv学习之路(21)、模板匹配及应用

    一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using names ...

  9. OpenCV + CPP 系列(卌二)图像特征匹配( KAZE/AKAZE)

    文章目录 一.KAZE简介 二.代码演示 特征检测效果对比 演示匹配 一.KAZE简介 ECCV2012中出现了一种比SIFT更稳定的特征检测算法KAZE ([1]).KAZE的取名是为了纪念尺度空间 ...

最新文章

  1. pandas.DataFrame删除/选取含有特定数值的行或列实例
  2. 计算机主机内部结构连接,电脑主机内部结构介绍
  3. 散列算法,Remal使用散列算法
  4. mvc html.antiforgerytoken,MVC Html.AntiForgeryToken() 防止CSRF***
  5. 在数据库中, 不用max()/min()找出一个列中最大/最小值的记录
  6. C#设计模式之21-策略模式
  7. dataframe 添加列表到一个单元格并解决报错ValueError: Must have equal len keys and value when setting with an...
  8. 手机UI界面模板psd源文件格式!
  9. 8条体面的程序员偷懒技巧
  10. elementui树状菜单tree_Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)...
  11. 解决android webkit的css postion:fixed支持问题
  12. Django【跨域】
  13. WPF应用程序启动顺序机制
  14. 从零开始学ArcGIS Server(三)--如何创建一个个人地理数据库ArcSDE Personal geodatabase...
  15. linux配置ssh免密码登录
  16. HC-SR501红外人体传感模块封锁时间调整
  17. 装多系统的U盘启动盘的制作
  18. 【渝粤题库】陕西师范大学165106 冲突与沟通管理作业 (高起专)
  19. 系综理论(Ensemble Theory)
  20. 四种两轮差速驱动机器人底盘特性分析

热门文章

  1. oracle的redo与undio
  2. [转载] 七龙珠第一部——第115话 一定要找到迷般的超神水
  3. SCCM 2007 R2 报表问题(二)
  4. ICallbackEventHandler不支持二次回调的问题
  5. Nginx出现500 Internal Server Error 错误的解决方案
  6. NodeJS使用淘宝 NPM 镜像/NPM使用国内源
  7. java 课后习题 Vector类的 初使用
  8. 【git clone 报错】fatal: unable to access ‘https://github.com/zimeng303/React.git/‘: Failed to connect
  9. 【Recat 应用】之 React 脚手架
  10. 云服务器 ECS(CentOS) 安装 Node