import cv2
import numpy as np def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch):
h1, w1 = img1_gray.shape[:2]
h2, w2 = img2_gray.shape[:2] vis = np.zeros((max(h1, h2), w1 + w2, 3), np.uint8)
vis[:h1, :w1] = img1_gray
vis[:h2, w1:w1 + w2] = img2_gray p1 = [kpp.queryIdx for kpp in goodMatch]
p2 = [kpp.trainIdx for kpp in goodMatch] post1 = np.int32([kp1[pp].pt for pp in p1])
post2 = np.int32([kp2[pp].pt for pp in p2]) + (w1, 0) for (x1, y1), (x2, y2) in zip(post1, post2):
cv2.line(vis, (x1, y1), (x2, y2), (0,0,255)) cv2.namedWindow("match",cv2.WINDOW_NORMAL)
cv2.imshow("match", vis) img1_gray = cv2.imread("D:\\05.jpg")
img2_gray = cv2.imread("D:\\06.jpg") sift = cv2.SIFT()
#sift = cv2.SURF() kp1, des1 = sift.detectAndCompute(img1_gray, None)
kp2, des2 = sift.detectAndCompute(img2_gray, None) # BFmatcher with default parms
bf = cv2.BFMatcher(cv2.NORM_L2)
matches = bf.knnMatch(des1, des2, k = 2) goodMatch = []
for m,n in matches:
if m.distance < 0.50*n.distance:
goodMatch.append(m) drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch[:20]) cv2.waitKey(0)
cv2.destroyAllWindows()


sift特征匹配效果:




SURF特征匹配效果:




说明:

  • 1.  Sift特征和Surf特征提取特征的方法略有差异,在整个匹配流程上一样
  • 2.  knnMatch(des1, des2,k
    = 2) 函数执行特征点匹配, k = 2 定义基准图像上的一个点会在另一幅图像上有2个匹配结果。
  • 3.  不论Sift还是Surf都是强制匹配,不能保证匹配的点就是准确的,只能保证相对正确。
  • 4.  goodMatch是经过筛选的优质配对,如果2个配对中第一匹配的距离小于第二匹配的距离的0.5,基本可以说明这个第一配对是两幅图像中独特的,不重复的特征点。当然并不能保证goodMatch保留的就是最优匹配。
  • 5. OpenCV3中有drawMatchesKnn()函数,可以直接拼接显示配对点,OpenCV2中没有这个函数,定义的drawMatchesKnn_cv2()实现了配对显示部分功能。

OpenCV-Python sift/surf特征匹配与显示的更多相关文章

  1. 【OpenCV新手教程之十八】OpenCV仿射变换 &amp; SURF特征点描写叙述合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)  ...

  2. Opencv中使用Surf特征实现图像配准及对透视变换矩阵H的平移修正

    图像配准需要将一张测试图片按照第二张基准图片的尺寸.角度等形态信息进行透视(仿射)变换匹配,本例通过Surf特征的定位和匹配实现图像配准. 配准流程: 1. 提取两幅图像的Surf特征 2. 对Sur ...

  3. 利用SIFT进行特征匹配

    SIFT算法是一种基于尺度空间的算法.利用SIFT提取出的特征点对旋转.尺度变化.亮度变化具有不变性,对视角变化.仿射变换.噪声也有一定的稳定性. SIFT实现特征的匹配主要包括四个步骤: 提取特征点 ...

  4. SURF 特征匹配

    参考:http://www.cnblogs.com/ronny/p/4045979.html,博主对源码进行了分析,不过很多没看明白. 分为几个部分.积分图:借助积分图像,图像与高斯二阶微分模板的滤波 ...

  5. OpenCV 之 特征匹配

    OpenCV 中有两种特征匹配方法:暴力匹配 (Brute force matching) 和 最近邻匹配 (Nearest Neighbors matching) 它们都继承自 Descriptor ...

  6. 【OpenCV新手教程之十七】OpenCV重映射 &amp; SURF特征点检測合辑

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)  ...

  7. opencv学习之路(35)、SURF特征点提取与匹配(三)

    一.简介 二.opencv中的SURF算法接口 三.特征点匹配方法 四.代码 1.特征点提取 #include "opencv2/opencv.hpp" #include < ...

  8. opencv surf特征点匹配拼接源码

    http://blog.csdn.net/huixingshao/article/details/42672073 /** * @file SURF_Homography * @brief SURF ...

  9. 基于OpenCV全景拼接(Python)SIFT/SURF

    一.实验内容: 利用sift算法,实现全景拼接算法,将给定的两幅图片拼接为一幅. 二.实验环境: 主机配置: CPU :intel core i5-7300 2.50GHZ RAM :8.0GB 运行 ...

随机推荐

  1. centos7 安装vnc服务

    一,安装服务器端 1,添加用户: # useradd vnc # passwd vnc 2,安装gnome桌面 # yum groupinstall "GNOME Desktop" ...

  2. CSS3 - 鼠标移入移出时改变样式

    1,使用伪类实现样式切换伪类是CSS2.1时出现的新特性,让许多原本需要JavaScript才能做出来的效果使用CSS就能实现.比如实现下面的鼠标悬停效果,只要为:hover伪类应用一组新样式即可.当 ...

  3. mysql数据库的导出与导入

    导出 在dos节目,切换到mysql依照文件夹的bin下.输入下面命令 mysqldump -u root -p nxu_life > nxu_life2.sql 运行完毕后.就能够看到在bin ...

  4. Jmeter + Ant + Jenkins 接口/性能测试,持续集成环境搭建

    1. 安装Jmeter.jdk Jmeter 3.3版本 :<http://note.youdao.com/noteshare?id=5e3fd287db24d08386207a7de22d26 ...

  5. WinForm开发----关闭window窗体最好的办法

    最近有一人问道,如何切换窗体.一想到这,我就想,不就是new一个form,然后就show么? 可是我发现,当你控制某个属性的时候,不是不能控制,只是很麻烦而已.有没有好的办法?当然有,咋办? 最简单最 ...

  6. Card Collector

    In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...

  7. Win7程序运行出现Windows Based Scrip Host 已停止工作问题的解决方法

    最近在使用类似于Teamviewer这样的程序时,突然运行不了,报错:Microsoft Windows Based Scrip Host 已停止工作的问题,从系统日志来看,好像是空指针问题,但是又无 ...

  8. maven assembly 配置详解

    Maven Assembly插件介绍 博客分类: 项目构建   你是否想要创建一个包含脚本.配置文件以及所有运行时所依赖的元素(jar)Assembly插件能帮你构建一个完整的发布包. Assembl ...

  9. JavaScript 中 onload 事件绑定多个方法的优化建议

    页面加载完毕时会触发 onload 事件.基于内容(HTML)要与行为(JavaScript)分离的编码思想,我们需要将一些对页面的初始化操作写在方法内,并通过window.onload = func ...

  10. python基础-第五篇-5.2递归

    又是一个阳光明媚的日子,小白看着刚刚从东边升起的太阳,感觉太阳爷爷也在向她打招呼,小白就不经的微笑起来!心想:今天又会学到什么有趣的东西呢?有些小期待,也有些小激动! 小刘来得比小白还早,两辆相视而笑 ...