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

匹配准确率非常高。

单应性指的是图像在投影发生了 畸变后仍然能够有较高的检测和匹配准确率

 # coding:utf-8

 """
单应性匹配:
两幅图像中的一幅 出现投影畸变的时候,他们还能彼此匹配
""" import cv2
import numpy as np
# 最小匹配数量设为10个, 大于这个数量从中筛选出10个最好的
MIN_MATCH_COUNT = 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) # kdtree建立索引方式的常量参数
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50) # checks指定索引树要被遍历的次数
flann = cv2.FlannBasedMatcher(index_params, search_params)
# 进行匹配搜索
matches = flann.knnMatch(des1, des2, k=2) # 寻找距离近的放入good列表
good = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good.append(m) # 如果足够多 就筛选
if len(good) > MIN_MATCH_COUNT:
# 通过距离近的描述符 找到两幅图片的关键点
src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) # 单应性匹配图关键点匹配线。。不懂啥意思
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
matchesMask = mask.ravel().tolist() h, w = img1.shape # 计算第二张图相对于第一张图的畸变
pts = np.float32([[0, 0], [0, h-1], [w-1, 0]]).reshape(-1, 1, 2)
dst = cv2.perspectiveTransform(pts, M)
img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
else:
matchesMask = None draw_params = dict(
matchColor=(0, 255, 0),
singlePointColor=None,
matchesMask=matchesMask,
flags=2
) img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
cv2.imshow("", img3)
cv2.waitKey()

最新文章

  1. Jquery对网页高度、宽度的操作
  2. python 数据类型---列表使用之三
  3. Normalize.css的使用及下载
  4. gradle相关配置内容解析
  5. (二十一)状态模式详解(DOTA版)
  6. 3ds max删除了对象后,还是将原来所有对象输出的原因
  7. Codeforces Round #264 (Div. 2)
  8. purple-accessData
  9. 【BZOJ】【1492】【NOI207】货币兑换Cash
  10. mongodb使用中遇到的问题汇总
  11. maxlength属性在textarea里奇怪的表现
  12. OpenWrt固件刷入后串口终端没有反应的问题
  13. AFNetworking 系列教程
  14. 集合运算符之全集、交集、补集【weber出品必属精品】
  15. use EXPORT和use EXPORT_OK
  16. isPostBack原理
  17. Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
  18. Python学习笔记(八)
  19. cocos creator 碰撞检测
  20. [java]static关键字的四种用法

热门文章

  1. Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again错误解决
  2. jQuery基础之二(操作标签)
  3. 25、LinkedList特有方法
  4. sparse coding
  5. Spring4笔记5--基于注解的DI(依赖注入)
  6. C# 链接webservice报错
  7. Python 正则表达式提高
  8. java基础78 Servlet的生命周期
  9. java基础64 JavaScript中的Arrays数组对象和prototype原型属性(网页知识)
  10. ThinkPHP小知识点