OpenCV基本图像处理操作(九)——特征匹配

news2024/10/6 6:01:26
Brute-Force蛮力匹配

Brute-Force蛮力匹配是一种简单直接的模式识别方法,经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括:

  1. 特征提取:首先,从两个待比较的图像中提取关键特征点。这些特征点通常是图像中的角点、边缘或其他显著的图像属性。

  2. 特征描述:对提取出的每个特征点生成一个描述符,这个描述符捕捉了特征点周围的图像信息,通常是通过一定的算法(如SIFT、SURF或ORB等)来实现。

  3. 匹配过程:在蛮力匹配中,源图像的每个特征点的描述符都会与目标图像中每个特征点的描述符进行比较。比较通常基于描述符之间的距离度量(如欧氏距离或汉明距离),以找到最相似的匹配对。

  4. 选择最佳匹配:根据某种标准(如最小距离)从所有可能的匹配中选择最佳匹配。有时也会使用比如比率测试来进一步验证匹配的质量,以排除错误匹配。

虽然Brute-Force匹配方法在小型或中等复杂度的数据集上可以非常有效,但它的计算成本随着特征点数量的增加而显著增加,这可能导致在大规模数据集上的性能问题。因此,它通常被用于那些对实时性要求不是非常高的应用,或者作为复杂匹配算法的初步匹配步骤。

import cv2 
import numpy as np
import matplotlib.pyplot as plt
def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img1 = cv2.imread('box.png', 0)
img2 = cv2.imread('box_in_scene.png', 0)
cv_show('img1',img1)
cv_show('img2',img2)
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# crossCheck表示两个特征点要互相匹,例如A中的第i个特征点与B中的第j个特征点最近的,并且B中的第j个特征点到A中的第i个特征点也是 
#NORM_L2: 归一化数组的(欧几里德距离),如果其他特征计算方法需要考虑不同的匹配计算方式
bf = cv2.BFMatcher(crossCheck=True)

在这里插入图片描述
在这里插入图片描述

1对1的匹配
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2)
cv_show('img3',img3)

在这里插入图片描述

k对最佳匹配

cv2.BFMatcher() 创建一个Brute-Force匹配器对象,该对象可以用来匹配两个图像之间的特征点。Brute-Force匹配是一种在两组特征点之间找到最佳匹配的简单方法,通过计算一个特征点与另一组中所有特征点之间的距离来实现。

然后,knnMatch 方法被用来找到每个描述符的前k个最佳匹配。在这个例子中,k被设为2,这意味着对于第一组描述符中的每个描述符(des1),算法将找到与第二组描述符(des2)中距离最近的两个描述符。这种方法通常用于执行比如SIFT或SURF这类特征描述符的匹配。

返回的matches是一个列表,其中每个元素也是一个列表,包含两个最佳匹配(因为k=2)。这允许进一步的处理,例如使用比率测试来过滤不良匹配。比率测试通常涉及比较两个最佳匹配之间的距离比,如果第一个距离明显小于第二个(例如,小于阈值的50%),那么我们认为这是一个“好”的匹配。这有助于排除错误的匹配,提高匹配质量。

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
cv_show('img3',img3)

在这里插入图片描述

如果需要更快速完成操作,可以尝试使用cv2.FlannBasedMatcher

cv2.FlannBasedMatcher() 创建了基于FLANN(Fast Library for Approximate Nearest Neighbors)的匹配器对象。FLANN是一个用于大数据集和高维特征的快速近似最近邻搜索库,通常比Brute-Force匹配在这类情况下执行得更快。

knnMatch 方法同样被用来在两组特征描述符之间找到每个描述符的前k个最佳匹配,这里的 k 设为2。这意味着对于第一组描述符(des1)中的每个描述符,FLANN匹配器将在第二组描述符(des2)中找到两个最近似的匹配。

返回的 matches 是一个列表,每个元素也是一个列表,包含每个描述符的两个最佳匹配。这同样允许进一步的处理,比如通过比率测试来过滤掉那些质量不高的匹配,增强匹配结果的准确性。

bf = cv2.FlannBasedMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])
img4 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
cv_show('img4',img4)

在这里插入图片描述

随机抽样一致算法(Random sample consensus,RANSAC)

在这里插入图片描述
选择初始样本点进行拟合,给定一个容忍范围,不断进行迭代
在这里插入图片描述
每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果
在这里插入图片描述

单应性矩阵

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VOC2012数据集免费获取

你是否遇到过如下情况&#xff1a; 使用官方网站下载数据集&#xff0c;emmm这效率 我放到网盘中了&#xff0c;有需要的自取 https://pan.quark.cn/s/f8b457086b6c

1.为什么选择Vue框架

参考&#xff1a;百战程序员 为什么选择Vue框架 Vue是什么&#xff1f; 渐进式 JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以…

开源贡献代码之​探索一下CPython

探索一下Cython 本篇文章将会围绕最近给Apache提的一个feature为背景&#xff0c;展开讲讲CPython遇到的问题&#xff0c;以及尝试自己从0写一个库出来&#xff0c;代码也已经放星球了&#xff0c;感兴趣的同学可以去下载学习。 0.背景 最近在给apache arrow提的一个feature因为…

Unity UGUI透明区域点击无效

是这样的&#xff0c;我有一张图&#xff0c;客户给的是1920*1080&#xff0c;但只有中间部分是按钮&#xff0c;是有效像素。为了让空白区域点击无效。需要设置如下 并且加上下面这句 this.GetComponent<Image>().alphaHitTestMinimumThreshold 0.1f;

设计模式学习笔记 - 开源实战三(中):剖析Google Guava中用到的设计模式

概述 上篇文章&#xff0c;我通过 Google Guava 这样一个优秀的开源类库&#xff0c;讲解了如何在业务开发中&#xff0c;发现跟业务无关、可以复用的通用功能模块&#xff0c;并将它们抽离出来&#xff0c;设计成独立的类库、框架或功能组件。 本章再来学习下&#xff0c;Go…

Vue3——组件基础

组件基础 1. 组件定义与使用 1.1 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>组件基础&l…

力扣-LCP 02.分式化简

题解&#xff1a; class Solution:def fraction(self, cont: List[int]) -> List[int]:# 初始化分子和分母为 0 和 1n, m 0, 1# 从最后一个元素开始遍历 cont 列表for a in cont[::-1]:# 更新分子和分母&#xff0c;分别为 m 和 (m * a n)n, m m, (m * a n)# 返回最终的…

程序员如何应对久坐带来的不良影响

久坐是程序员工作中常见的问题&#xff0c;它可能对身体健康产生多种负面影响。为了应对这些影响&#xff0c;程序员可以采取以下措施&#xff1a; 定时休息&#xff1a;每隔45分钟至1小时&#xff0c;起身活动5-10分钟。这可以帮助缓解长时间坐姿带来的身体压力&#xff0c;促…

YOLOv9改进策略 | 添加注意力篇 | 挤压和激励单元SENetV2助力YOLOv9细节涨点(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一种通道型的注意力机制但是相对于SENetV1来说…

Aws Nat Gateway

要点 NAT网关要能访问外网&#xff0c;所以需要部署在有互联网网关的Public子网中。 关键&#xff1a; NAT网关创建是选择子网&#xff0c;一定要选择公有子网&#xff08;有互联网网关子网&#xff09; 特别注意&#xff1a; 新建nat网关的时候&#xff0c;选择的子网一定…

Ubuntu无法安装向日癸15.2.0.63062_amd64.deb最新版

Ubuntu安装向日葵远程控制 安装包下载 安装方式 方式一&#xff1a;运行安装包安装 方式二&#xff1a;终端命令安装 通过以下教程可以快速的安装向日葵远程控制&#xff0c;本教程适用于Ubuntu18.04/20.04/22.04 安装包下载 进入向日葵远程控制下载官网下载向日葵远程控制Lin…

使用Python+opencv实现自动扫雷

大家好&#xff0c;相信许多人很早就知道有扫雷这么一款经典的游戏&#xff0c;更是有不少人曾听说过中国雷圣&#xff0c;也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏&#xff0c;从过去到现在依然都有着它独特的…

Spark-机器学习(3)回归学习之线性回归

在之前的文章中&#xff0c;我们了解我们的机器学习&#xff0c;了解我们spark机器学习中的特征提取和我们的tf-idf&#xff0c;word2vec算法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你…

安居水站:水站经营秘籍:年入30万不是梦。水站创业指南。

在这个快节奏的社会里&#xff0c;初创企业家们总是在寻找一条明路&#xff0c;以在竞争激烈的市场中立足。为了帮助他们更好地实现这一目标&#xff0c;我根据经验决定制定一份水站经营指导手册。这份手册将详细阐述如何从零起步&#xff0c;如何运营&#xff0c;如何进行市场…

开源博客项目Blog .NET Core源码学习(16:App.Hosting项目结构分析-4)

本文学习并分析App.Hosting项目中前台页面的文章专栏页面和文章详情页面。< 文章专栏页面 文章专栏页面总体上为左右布局&#xff0c;左侧显示文章列表&#xff0c;右侧从上向下为关键词搜索、分类导航、热门文章等内容。整个页面使用了layui中的面包屑导航、表单、模版、流…

【C++初阶】List使用特性及其模拟实现

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前…

利用OpenCV4.9制作自己的线性滤波器!

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9使用 inRange 的阈值操作 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 f…

Android JetPack Compose+Room----实现搜索记录功能

文章目录 需求概述功能展示实现搜索功能使用的技术1.Android Jetpack room2.Android JetPack Compose 代码实现编写搜索界面接入Room实现搜索功能的管理引入依赖定义包结构定义操作表的Dao类定义数据库的基础配置定义数据库的Dao管理类使用数据库升级 源码地址 需求概述 搜索功…

java:Java中的抽象类

什么是抽象类&#xff1a; 我们知道&#xff0c;类用来模拟现实的事物&#xff0c;一个类模拟一类事物&#xff0c;某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性&#xff0c;当一个类中给出的信息足够全面时候&#xff0c;我们就…

算法练习|Leetcode189轮转数组 ,Leetcode56合并区间,Leetcode21合并两个有序链表,Leetcode2两数相加,sql总结

目录 一、Leetcode189轮转数组题目描述解题思路方法:切片总结 二、Leetcode56合并区间题目描述解题思路方法:总结 三、Leetcode21合并两个有序链表题目描述解题思路方法:总结 四、Leetcode2两数相加题目描述解题思路方法:总结 sql总结: 一、Leetcode189轮转数组 题目描述 给定…