OpenCV特征匹配和单应性矩阵查找对象详解

 更新时间:2023年04月26日 11:13:44   作者:uncle_ll  
这篇文章主要为大家介绍了OpenCV特征匹配和单应性矩阵查找对象详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

目标

在本章中,将学习

  • 将从Calib3D模块中混淆特征匹配和找到(单应性矩阵)homography,以查找复杂图像中的已知对象。

基础

在之前的内容中,使用了一个query image,在其中找到了一些特征点,拍摄了另一张train image,也在该图像中找到了特征,找到了其中最好的匹配。简而言之,在另一张杂乱的图像中找到了物体某些部分的位置。该信息足以准确地在train image上找到对象

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

之前的内容中可以看到,匹配的时候可能存在一些可能的错误,这可能会影响结果。为了解决这个问题,算法使用RANSACLEAST_MEDIAN(可以由标志决定)。如此良好的匹配,提供正确估计称为inliers,并且剩余的称为异常值cv2.findhomography()返回一个掩码,指定Inlier和异常值

实现

首先,像往常一样,在图像中查找SIFT特征,并应用比率测试来找到最佳匹配。

现在设置了一个至少10的匹配(由min_match_count定义)的条件是在那里找到对象。否则简单地显示一条消息,表明不够匹配。

**如果找到有足够的匹配,将在两个图像中提取匹配项点的位置。**通过以找到相似的转变。一旦获得此3x3转换矩阵,将使用它将QueryImage的角转换为TrainImage中的对应点,然后画出来。

import cv2
import numpy as np
from matplotlib import pyplot as plt

MIN_MATCH_COUNT = 10

img1 = cv2.imread('box2.png', 0)  # query image
img2 = cv2.imread('box_in_scene.png', 0)  # train image

# Initial SIFT detector
sift = cv2.xfeatures2d.SIFT_create()

# find the keypoints and descriptiors with 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 = cv2.FlannBasedMatcher(index_params, search_params)

matches = flann.knnMatch(des1, des2, k=2)

# store all the good matches as per lows ratio test
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, 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:
    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 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
plt.imshow(img3, 'gray')
plt.show()

结果如下。在杂乱图像中用白色颜色标记匹配的物体

在这里插入图片描述

附加资源

以上就是OpenCV特征匹配和单应性矩阵查找对象详解的详细内容,更多关于OpenCV特征匹配单应性的资料请关注脚本之家其它相关文章!

相关文章

  • Python中json格式数据的编码与解码方法详解

    Python中json格式数据的编码与解码方法详解

    这篇文章主要介绍了Python中json格式数据的编码与解码方法,详细分析了Python针对json格式数据的编码转换操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • python利用小波分析进行特征提取的实例

    python利用小波分析进行特征提取的实例

    今天小编就为大家分享一篇python利用小波分析进行特征提取的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python文件转为exe文件的方法及用法详解

    python文件转为exe文件的方法及用法详解

    py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序。本文重点给大家介绍python文件转为exe文件的方法,感兴趣的朋友跟随小编一起看看吧
    2019-07-07
  • 基于Python实现文件的压缩与解压缩

    基于Python实现文件的压缩与解压缩

    在日常工作中,除了会涉及到使用Python处理文本文件,有时候还会涉及对压缩文件的处理。本文为大家总结了利用Python可以实现的几种文件压缩与解压缩实现代码,需要的可以参考一下
    2022-03-03
  • Python flask项目入门教程

    Python flask项目入门教程

    flask 是一门使用 python 编写的后端框架,这篇文章主要介绍了Python flask项目入门教程,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • opencv转换颜色空间更改图片背景

    opencv转换颜色空间更改图片背景

    这篇文章主要为大家详细介绍了opencv转换颜色空间更改图片背景,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • tensorflow卷积神经Inception V3网络结构代码解析

    tensorflow卷积神经Inception V3网络结构代码解析

    这篇文章主要为大家介绍了卷积神经Inception V3网络结构代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python tornado上传文件功能实现(前端和后端)

    python tornado上传文件功能实现(前端和后端)

    Tornado 是一个功能强大的 Web 框架,除了基本的请求处理能力之外,还提供了一些高级功能,在 Tornado web 框架中,上传图片通常涉及创建一个表单,让用户选择文件并上传,本文介绍tornado上传文件功能,感兴趣的朋友一起看看吧
    2024-03-03
  • 详解Python中的type()方法的使用

    详解Python中的type()方法的使用

    这篇文章主要介绍了详解Python中的type()方法的使用,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python爬虫数据处理模块的安装使用教程

    Python爬虫数据处理模块的安装使用教程

    这篇文章主要为大家介绍了Python爬虫数据处理模块的安装使用教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论