git:https://github.com/linyi0604/Computer-Vision

bf暴力匹配:

 # coding:utf-8

 import cv2

 """
orb特征检测和匹配
两幅图片分别是 乐队的logo 和包含该logo的专辑封面
利用orb进行检测后进行匹配两幅图片中的logo """
# 按照灰度图像的方式读入两幅图片
img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE) # 创建ORB特征检测器和描述符
orb = cv2.ORB_create()
# 对两幅图像检测特征和描述符
keypoint1, descriptor1 = orb.detectAndCompute(img1, None)
keypoint2, descriptor2 = orb.detectAndCompute(img2, None)
"""
keypoint 是一个包含若干点的列表
descriptor 对应每个点的描述符 是一个列表, 每一项都是检测到的特征的局部图像 检测的结果是关键点
计算的结果是描述符 可以根据监测点的描述符 来比较检测点的相似之处 """
# 获得一个暴力匹配器的对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 利用匹配器 匹配两个描述符的相近成都
maches = bf.match(descriptor1, descriptor2)
# 按照相近程度 进行排序
maches = sorted(maches, key=lambda x: x.distance)
# 画出匹配项
img3 = cv2.drawMatches(img1, keypoint1, img2, keypoint2, maches[: 30], img2, flags=2) cv2.imshow("matches", img3)
cv2.waitKey()
cv2.destroyAllWindows()

knn匹配:

 # coding:utf-8

 import cv2

 # 按照灰度图像读入两张图片
img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE) # 获取特征提取器对象
orb = cv2.ORB_create()
# 检测关键点和特征描述
keypoint1, desc1 = orb.detectAndCompute(img1, None)
keypoint2, desc2 = orb.detectAndCompute(img2, None)
"""
keypoint 是关键点的列表
desc 检测到的特征的局部图的列表
"""
# 获得knn检测器
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.knnMatch(desc1, desc2, k=1)
"""
knn 匹配可以返回k个最佳的匹配项
bf返回所有的匹配项
"""
# 画出匹配结果
img3 = cv2.drawMatchesKnn(img1, keypoint1, img2, keypoint2, matches, img2, flags=2)
cv2.imshow("matches", img3)
cv2.waitKey()
cv2.destroyAllWindows()

FLANN匹配:

# coding:utf-8

import cv2

"""
FLANN是类似最近邻的快速匹配库
它会根据数据本身选择最合适的算法来处理数据
比其他搜索算法快10倍
"""
# 按照灰度图片读入
img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE)
# 创建sift检测器
sift = cv2.xfeatures2d.SIFT_create()
# 查找监测点和匹配符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
"""
keypoint是检测到的特征点的列表
descriptor是检测到特征的局部图像的列表
"""
# 获取flann匹配器
FLANN_INDEX_KDTREE = 0
indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
searchParams = dict(checks=50)
flann = cv2.FlannBasedMatcher(indexParams, searchParams)
# 进行匹配
matches = flann.knnMatch(des1, des2, k=2)
# 准备空的掩膜 画好的匹配项
matchesMask = [[0, 0] for i in range(len(matches))] for i, (m, n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i] = [1, 0] drawPrams = dict(matchColor=(0, 255, 0),
singlePointColor=(255, 0, 0),
matchesMask=matchesMask,
flags=0)
# 匹配结果图片
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **drawPrams) cv2.imshow("matches", img3)
cv2.waitKey()
cv2.destroyAllWindows() 

最新文章

  1. linux下mono播放PCM音频
  2. javaweb学习总结(十一)——使用Cookie进行会话管理
  3. strong &amp; weak
  4. redis 多数据库
  5. Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana 分块
  6. 用EF DataBase First做一个简单的MVC3报名页面
  7. 学习笔记TF020:序列标注、手写小写字母OCR数据集、双向RNN
  8. 关于戴尔没有活动分区,遇到了“Windows安装程序无法将windows配置为在此计算机的硬件上运行”提示等
  9. 算法训练 K好数
  10. [转]Web应用防火墙WAF详解
  11. vue中v-model 与 v-bind:value
  12. Java基础——Ajax(一)
  13. Linux中程序开机自启
  14. 堆栈详解 + 彻底理解Java的值传递和引用传递
  15. 网页定时器setTimeout( )
  16. MyBatis实战之初步
  17. java 获取当前方法名
  18. Codeforces-475B Strongly Connected City
  19. CodeForces 909D Colorful Points
  20. 一句话说说java设计模式

热门文章

  1. c/c++ const 用法
  2. Request爬取网站(seo.chinaz.com)百度权重的查询结果
  3. Python练习-从小就背不下来的99乘法表
  4. shell脚本-监控及邮件提醒
  5. UNIX环境高级编程 第3章 文件I/O
  6. 2016.6.1——Min Stack
  7. 【算法学习】【洛谷】树链剖分 &amp; P3384 【模板】树链剖分 P2146 软件包管理器
  8. Python Webdriver 重新使用已经打开的浏览器实例
  9. Integer to Roman &amp; Roman to Integer
  10. [shell]shell中if语句的使用