【opencv学习】SIFT算法的基本使用以及特征匹配
下面我们学习特征点匹配的使用
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算法的基本使用以及特征匹配相关推荐
- python+openCV使用SIFT算法实现印章的总相似度检测
python实现,使用SIFT算法和文字相似度检测算法,并使用了pyqt5做的印章相似度检测工具,还有很大优化空间,对于我这水平费了不少力气,记录一下. 首先整体流程是预建了一个印章库,包含若干张图片 ...
- Opencv实现Sift、Surf、ORB特征提取与匹配
在opencv3中,这三个算子都转移到一个名为xfeature2d的第三方库中,而在opencv2中这三个算子在nonfree库中. 关于在vs下配置opencv可参考我转载的另外一篇文章.注意版本号 ...
- SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析
图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...
- SIFT算法详解——图像特征提取与匹配
文章目录 前言 一.建立高斯差分金字塔 1.建立高斯金字塔 2.建立高斯差分金字塔 3.建塔过程中参数的设定及相关细节问题 二.关键点(key points)位置确定 1.阈值化 2.在高斯差分金字塔 ...
- OpenCV + CPP 系列(卌一)图像特征匹配( FLANN 匹配)
文章目录 一.FLANN简介 演示SURF--Flann 二.单应性矩阵 一.FLANN简介 FLANN库全称是Fast Library for Approximate Nearest Neighbo ...
- 学习sift算法的原理和步骤_深度学习笔记47_你也可以成为梵高_风格迁移算法的原理
神经风格迁移 可用来干什么? 同deepDream一样是驱动图像修改的一个重大进展.可以把照片风格化,看起来就像是一幅画一样.这些为你提供非常多漂亮的艺术风格,就像是梵高所画的<星夜>. ...
- opencv学习笔记三十六:AKAZE特征点检测与匹配
KAZE是日语音译过来的 , KAZE与SIFT.SURF最大的区别在于构造尺度空间,KAZE是利用非线性方式构造,得到的关键点也就更准确(尺度不变性 ): Hessian矩阵特征点检测 ,方向指定, ...
- opencv学习之路(21)、模板匹配及应用
一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using names ...
- OpenCV + CPP 系列(卌二)图像特征匹配( KAZE/AKAZE)
文章目录 一.KAZE简介 二.代码演示 特征检测效果对比 演示匹配 一.KAZE简介 ECCV2012中出现了一种比SIFT更稳定的特征检测算法KAZE ([1]).KAZE的取名是为了纪念尺度空间 ...
最新文章
- pandas.DataFrame删除/选取含有特定数值的行或列实例
- 计算机主机内部结构连接,电脑主机内部结构介绍
- 散列算法,Remal使用散列算法
- mvc html.antiforgerytoken,MVC Html.AntiForgeryToken() 防止CSRF***
- 在数据库中, 不用max()/min()找出一个列中最大/最小值的记录
- C#设计模式之21-策略模式
- dataframe 添加列表到一个单元格并解决报错ValueError: Must have equal len keys and value when setting with an...
- 手机UI界面模板psd源文件格式!
- 8条体面的程序员偷懒技巧
- elementui树状菜单tree_Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)...
- 解决android webkit的css postion:fixed支持问题
- Django【跨域】
- WPF应用程序启动顺序机制
- 从零开始学ArcGIS Server(三)--如何创建一个个人地理数据库ArcSDE Personal geodatabase...
- linux配置ssh免密码登录
- HC-SR501红外人体传感模块封锁时间调整
- 装多系统的U盘启动盘的制作
- 【渝粤题库】陕西师范大学165106 冲突与沟通管理作业 (高起专)
- 系综理论(Ensemble Theory)
- 四种两轮差速驱动机器人底盘特性分析
热门文章
- oracle的redo与undio
- [转载] 七龙珠第一部——第115话 一定要找到迷般的超神水
- SCCM 2007 R2 报表问题(二)
- ICallbackEventHandler不支持二次回调的问题
- Nginx出现500 Internal Server Error 错误的解决方案
- NodeJS使用淘宝 NPM 镜像/NPM使用国内源
- java 课后习题 Vector类的 初使用
- 【git clone 报错】fatal: unable to access ‘https://github.com/zimeng303/React.git/‘: Failed to connect
- 【Recat 应用】之 React 脚手架
- 云服务器 ECS(CentOS) 安装 Node