在本章节中, - 我们将把calib3d模块中的特征匹配和findHomography混合在一起,以在复杂图像中找到已知对象。

上节中,我们使用了queryImage,找到了其中的一些特征点,我们使用了另一个trainImage,也找到了该图像中的特征,并且找到了其中的最佳匹配。简而言之,我们在另一个混乱的图像中找到了对象某些部分的位置。此信息足以在trainImage上准确找到对象。

为此,**我们可以使用calib3d模块中的函数,即cv.findHomography()。如果我们从两个图像中传递点集,它将找到该对象的透视变换。然后,我们可以使用cv.perspectiveTransform()查找对象。**找到转换至少需要四个正确的点。

我们已经看到,匹配时可能会出现一些可能影响结果的错误。为了解决这个问题,算法使用RANSAC或LEAST_MEDIAN(可以由标志决定)。因此,提供正确估计的良好匹配称为“内部点”,其余的称为“外部点”。cv.findHomography()返回指定内部和外部点的掩码。
​​在图像中找到SIFT功能并应用比例测试以找到最佳匹配。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
MIN_MATCH_COUNT = 10
img1 = cv.imread('box.png',0)          # 索引图像
img2 = cv.imread('box_in_scene.png',0) # 训练图像
# 初始化SIFT检测器
sift = cv.xfeatures2d.SIFT_create()
# 用SIFT找到关键点和描述符
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1,des2,k=2)
# #根据Lowe的比率测试存储所有符合条件的匹配项。
good = []
for m,n in matches:if m.distance < 0.7*n.distance:good.append(m)

现在我们设置一个条件,即至少有10个匹配项(由MIN_MATCH_COUNT定义)可以找到对象。否则,只需显示一条消息,说明没有足够的匹配项。

如果找到足够的匹配项,我们将在两个图像中提取匹配的关键点的位置。他们被传递以寻找预期的转变。一旦获得了这个3x3转换矩阵,就可以使用它将索引图像的角转换为训练图像中的相应点。然后我们画出来。

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 = cv.findHomography(src_pts, dst_pts, cv.RANSAC,5.0)matchesMask = mask.ravel().tolist()h,w,d = img1.shapepts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)dst = cv.perspectiveTransform(pts,M)img2 = cv.polylines(img2,[np.int32(dst)],True,255,3, cv.LINE_AA)
else:print( "Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT) )matchesMask = None

最后,我们绘制内部线(如果成功找到对象)或匹配关键点(如果失败)。

draw_params = dict(matchColor = (0,255,0), # 用绿色绘制匹配singlePointColor = None,matchesMask = matchesMask, # 只绘制内部点flags = 2)
img3 = cv.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)
plt.imshow(img3, 'gray'),plt.show()

对象在混乱的图像中标记为白色的显示结果:

特征匹配 + 单应性查找对象相关推荐

  1. OpenCV系列之特征匹配+单应性查找对象 | 四十五

    目标 在本章节中, 我们将把calib3d模块中的特征匹配和findHomography混合在一起,以在复杂图像中找到已知对象 基础 那么我们在上一环节上做了什么?我们使用了queryImage,找到 ...

  2. OpenCV中的特征匹配+单应性以查找对象

    OpenCV中的特征匹配+单应性以查找对象 1. 效果图 2. 源码 参考 这篇博客将混合calib3d模块中的特征匹配和单应性,在复杂图像中查找已知对象. 1. 效果图 特征匹配 & 单应性 ...

  3. OpenCV39:特征匹配+单应性矩阵查找对象

    目标 在本章中,将学习 将从Calib3D模块中混淆特征匹配和找到(单应性矩阵)homography,以查找复杂图像中的已知对象. 基础 在之前的内容中,使用了一个query image,在其中找到了 ...

  4. OpenCV SURF FLANN匹配单应性的实例(附完整代码)

    OpenCV SURF FLANN匹配单应性的实例 OpenCV SURF FLANN匹配单应性的实例 OpenCV SURF FLANN匹配单应性的实例 #include <iostream& ...

  5. 透视变换 单应性矩阵怎么求 matlab,单应性(homography)变换的推导

    矩阵的一个重要作用是将空间中的点变换到另一个空间中.这个作用在国内的<线性代数>教学中基本没有介绍.要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中 ...

  6. python+OpenCV笔记(三十五):特征匹配——基于FLANN的匹配、基于FLANN进行单应性匹配

    目录 一.基于FLANN的匹配 FLANN匹配流程: 代码编写 二.基于FLANN进行单应性匹配 什么是单应性? FLANN进行单应性匹配流程 代码编写 FLANN库全称是Fast Library f ...

  7. 单应性Homograph估计:从传统算法到深度学习

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文作者:白裳 https://zhuanlan.zhihu.com/p/74597564 本文已由原 ...

  8. sift算法_单应性Homograph估计:从传统算法到深度学习

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 本文作者:白裳 https://zhuanlan.zhihu.com/p/74597564 本 ...

  9. akaze特征匹配怎么去掉不合适的点_单应性矩阵应用基于特征的图像拼接

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 前言 前面写了一篇关于单应性矩阵的相关文章,结尾说到基于特征的图像拼接跟对象检测中单应性矩阵应用场景.得到很多 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测
  2. linux svn客户端的使用
  3. JVM---垃圾回收算法详解
  4. git merge 冲突_更新了!深入浅出图解Git,入门到精通(保姆级教程)第三篇
  5. Linux Grep 命令说明
  6. java 注解 属性 类型_收藏!你一定要知道的Java8中的注解
  7. 前端学习(1985)vue之电商管理系统电商系统之本地分支放到git上面保存
  8. 外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动
  9. 珀尔:数据非常愚蠢,领会因果关系才是理解世界的关键
  10. python都用什么写代码_python都用什么写代码
  11. golang 正则表达式 perl 引擎_R | 正则表达式以grep()为例
  12. Android 设备上可以实现 3D Touch 吗?| 原力计划
  13. 大数据分析平台的重点发展方向
  14. 管理九段,你的管理入围“几段”了?
  15. 几何画板椭圆九种画法_几何画板怎么制作椭圆定义演示动画?
  16. asus官方android升级包,华硕ASUS手机平板官方刷机包raw格式解压修改工具
  17. 【HMS core】【push kit】【FAQ】华为推送服务 手机未收到推送消息/消息延迟/息屏通知 问题合集
  18. php元换成万元,元换算成万元公式(元换算成万元换算器)
  19. [Arch]常用软件安装使用
  20. java 学生学籍管理系统_JAVA测验—学生学籍管理系统

热门文章

  1. 作者:刘强强(1992-),男,贵州大学公共管理学院硕士生。
  2. 客座编辑:杜小勇(1963-),男,博士,中国人民大学信息学院教授、博士生导师。...
  3. 【操作系统】进程的创建与终止过程中的父子进程
  4. 【Navicat】Navicat数据格式化显示设置
  5. 【数据结构与算法】双链表V3.0的Java实现
  6. 区块链企业级解决方案 ( Hyperledger )
  7. 菜鸟关于mvc导出Excel的想法
  8. hive中分组取前N个值的实现
  9. 源代码加密-防泄密解决方案-SDC沙盒
  10. RAC crs_stat unknown资源状态处理