004 OpenCV akaze特征点检测匹配

目录

一、环境

二、akaze特征点算法

2.1、基本原理

2.2、实现过程

2.3、实际应用

2.4、优点与不足

三、代码

3.1、数据准备

3.2、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、akaze特征点算法

特征点检测算法AKAZE是一种广泛应用于图像处理领域的算法,它可以在不同尺度下提取图像的特征点,并具有尺度不变性和旋转不变性等优点。本文将概括介绍AKAZE算法的基本原理、实现过程以及其在实际应用中的表现。

2.1、基本原理

AKAZE算法是基于尺度空间理论和图像金字塔的,它通过非线性扩散滤波来构建尺度空间,并在尺度空间中检测关键点。在AKAZE中,关键点的检测是通过一个称为“加速非线性扩散”的过程来实现的,该过程可以快速地生成尺度空间。此外,AKAZE还采用了M-LDB描述子来描述特征点的周围区域。

2.2、实现过程

  1. 图像预处理:首先,对输入图像进行预处理,包括灰度化和降噪等操作,以提高算法的准确性。
  2. 构建尺度空间:然后,通过非线性扩散滤波来构建尺度空间,并在尺度空间中检测关键点。在这个过程中,采用了一种称为“加速非线性扩散”的方法,该方法可以快速地生成尺度空间。
  3. 关键点检测:在尺度空间中,采用基于区域的方法来检测关键点。这些关键点对应于图像中的局部极值点,即在周围区域内具有最大或最小的灰度值。
  4. 描述子生成:在检测到关键点后,AKAZE采用M-LDB描述子来描述特征点的周围区域。M-LDB描述子是一种改进的LDB描述子,它可以更好地描述图像的特征。
  5. 特征匹配:最后,通过比较不同图像之间的M-LDB描述子来进行特征匹配,从而识别出图像中的相似区域。

2.3、实际应用

AKAZE算法在实际应用中表现出了良好的性能,可以应用于许多领域,如目标识别、图像配准、拼接等。例如,在目标识别中,AKAZE可以用于检测图像中的目标特征点,并通过特征匹配来识别出目标物体。此外,AKAZE还可以用于图像拼接中,通过对齐不同图像中的特征点来实现无缝拼接。

2.4、优点与不足

AKAZE算法具有以下优点:

  1. 尺度不变性:AKAZE算法能够在不同尺度下提取图像的特征点,从而适应了不同尺度的图像。
  2. 旋转不变性:AKAZE算法具有旋转不变性,可以在不同角度下提取图像的特征点。
  3. 加速性能:与SIFT算法相比,AKAZE算法采用了加速非线性扩散方法来构建尺度空间,具有更快的运行速度。
  4. 稳健性:AKAZE算法对噪声和干扰具有较强的鲁棒性,能够提取出较为稳健的特征点。

然而,AKAZE算法也存在一些不足之处:

  1. 对光照变化敏感:AKAZE算法对光照变化较为敏感,可能会受到光照变化的影响。
  2. 对局部变化敏感:AKAZE算法对局部变化较为敏感,可能会导致误检或漏检。
  3. 需要手动设置参数:AKAZE算法需要手动设置一些参数,如尺度空间级数、加速非线性扩散的迭代次数等。这些参数的设置会影响到算法的性能和准确性。

总之,特征点检测算法AKAZE是一种有效的图像特征提取方法,具有尺度不变性和旋转不变性等优点。在实际应用中表现出了良好的性能,可以应用于许多领域。然而,它也存在一些不足之处,如对光照变化敏感、对局部变化敏感以及需要手动设置参数等。未来可以进一步改进和完善AKAZE算法的性能和准确性。

三、代码

3.1、数据准备

代码需要的两张图,一个xml格式的文件,即:H1to3p.xml,如下:

<?xml version="1.0"?>
<opencv_storage>
<H13 type_id="opencv-matrix"><rows>3</rows><cols>3</cols><dt>d</dt><data>7.6285898e-01  -2.9922929e-01   2.2567123e+023.3443473e-01   1.0143901e+00  -7.6999973e+013.4663091e-04  -1.4364524e-05   1.0000000e+00 </data></H13>
</opencv_storage>

3.2、完整代码

代码:

from __future__ import print_function
import cv2 as cv
import numpy as np
import argparse
from math import sqrt# 读取两张图片
parser = argparse.ArgumentParser(description='Code for AKAZE local features matching tutorial.')
parser.add_argument('--input1', help='Path to input image 1.', default='graf1.png') # 在这里设置图像1
parser.add_argument('--input2', help='Path to input image 2.', default='graf3.png') # 在这里设置图像2
parser.add_argument('--homography', help='Path to the homography matrix.', default='H1to3p.xml') # 在这里设置H矩阵
args = parser.parse_args()img1 = cv.imread(cv.samples.findFile(args.input1), cv.IMREAD_GRAYSCALE)
img2 = cv.imread(cv.samples.findFile(args.input2), cv.IMREAD_GRAYSCALE)
if img1 is None or img2 is None:print('Could not open or find the images!')exit(0)
fs = cv.FileStorage(cv.samples.findFile(args.homography), cv.FILE_STORAGE_READ)
homography = fs.getFirstTopLevelNode().mat()## 初始化算法[AKAZE]
akaze = cv.AKAZE_create()
# 检测图像1和图像2的特征点和特征向量
kpts1, desc1 = akaze.detectAndCompute(img1, None)
kpts2, desc2 = akaze.detectAndCompute(img2, None)## 基于汉明距离,使用暴力匹配来匹配特征点
matcher = cv.DescriptorMatcher_create(cv.DescriptorMatcher_BRUTEFORCE_HAMMING)
nn_matches = matcher.knnMatch(desc1, desc2, 2)## 下面0.8默认参数,可以手动修改、调试
matched1 = []
matched2 = []
nn_match_ratio = 0.8 # 最近邻匹配参数
for m, n in nn_matches:if m.distance < nn_match_ratio * n.distance:matched1.append(kpts1[m.queryIdx])matched2.append(kpts2[m.trainIdx])## 使用单应矩阵进行精匹配,进一步剔除误匹配点
inliers1 = []
inliers2 = []
good_matches = []
inlier_threshold = 2.5 # 如果两个点距离小于这个值,表明足够近,也就是一对匹配对
for i, m in enumerate(matched1):col = np.ones((3,1), dtype=np.float64)col[0:2,0] = m.ptcol = np.dot(homography, col)col /= col[2,0]dist = sqrt(pow(col[0,0] - matched2[i].pt[0], 2) +\pow(col[1,0] - matched2[i].pt[1], 2))if dist < inlier_threshold:good_matches.append(cv.DMatch(len(inliers1), len(inliers2), 0))inliers1.append(matched1[i])inliers2.append(matched2[i])## 可视化
res = np.empty((max(img1.shape[0], img2.shape[0]), img1.shape[1]+img2.shape[1], 3), dtype=np.uint8)
cv.drawMatches(img1, inliers1, img2, inliers2, good_matches, res)
cv.imwrite("akaze_result.png", res)inlier_ratio = len(inliers1) / float(len(matched1))
print('A-KAZE Matching Results')
print('*******************************')
print('# Keypoints 1:                        \t', len(kpts1))
print('# Keypoints 2:                        \t', len(kpts2))
print('# Matches:                            \t', len(matched1))
print('# Inliers:                            \t', len(inliers1))
print('# Inliers Ratio:                      \t', inlier_ratio)cv.imshow('result', res)
cv.waitKey()

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

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

相关文章

【数字图像处理】Gamma 变换

在数字图像处理中&#xff0c;Gamma 变换是一种重要的灰度变换方法&#xff0c;可以用于图像增强与 Gamma 校正。本文主要介绍数字图像 Gamma 变换的基本原理&#xff0c;并记录在紫光同创 PGL22G FPGA 平台的布署与实现过程。 目录 1. Gamma 变换原理 2. FPGA 布署与实现 2…

JSP 四大域对象

我们来说说JSP的四大域对象 首先 我们要了解他们是四种保存范围 第一种 是 Page范围 只作用于当前界面 只要页面跳转了 其他页面就拿不到了 第二种 request范围 在一次请求中有效 就是 我们服务端指向某个界面 并传递数据给他 那么 如果你是客户端跳转就不生效了 第三种 sessi…

经典ctf ping题目详解 青少年CTF-WEB-PingMe02

题目环境&#xff1a; 根据题目名称可知 这是一道CTF-WEB方向常考的知识点&#xff1a;ping地址 随便ping一个地址查看接受的数据包?ip0.0.0.0 有回显数据&#xff0c;尝试列出目录文件 堆叠命令使用’;作为命令之间的连接符&#xff0c;当上一个命令完成后&#xff0c;继续执…

深度学习二维码识别 计算机竞赛

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

windows中运行项目中.sh和kaggle安装与配置

在git bash中运行 命令如下&#xff1a; bash download_data.sh 或者 ./download_data.sh如果使用kaggle的数据集&#xff0c;会要求输入用户名和API。 API在这个文件里面&#xff0c;复制过来即可。 安装kaggle pip install kaggle去kaggle官网&#xff0c;点击这里&…

[一周AI简讯]OpenAI宫斗;微软Bing Chat更名Copilot;Youtube测试音乐AI

OpenAI宫斗&#xff0c;奥特曼被解雇&#xff0c;董事会内讧 Sam Altman被解雇&#xff0c;不再担任CEO&#xff0c;董事会的理由是奥特曼在与董事会的沟通中始终不坦诚&#xff0c;阻碍了董事会履行职责的能力。原首席技术官Mira Murati担任新CEO。OpenAI宫斗剧远未结束&…

【数据结构】图的简介(图的逻辑结构)

一.引例&#xff08;哥尼斯堡七桥问题&#xff09; 哥尼斯堡七桥问题是指在哥尼斯堡市&#xff08;今属俄罗斯&#xff09;的普雷格尔河&#xff08;Pregel River&#xff09;中&#xff0c;是否可以走遍每座桥一次且仅一次&#xff0c;最后回到起点的问题。这个问题被认为是图…

达梦数据库常用参数查询

字符集 字符是各种文字和符号的统称&#xff0c;包括各个国家文字、标点符号、表情、数字等等。 字符集 就是一系列字符的集合。字符集的种类较多&#xff0c;每个字符集可以表示的字符范围通常不同&#xff0c;就比如说有些字符集是无法表示汉字的。 常见的字符集有 ASCII、G…

开发知识点-前端-webpack

webpack技术笔记 一、 介绍二、 下载使用 一、 介绍 Webpack是一个现代 JavaScript 应用程序的静态模块打包器 打包&#xff1a;可以把js、css等资源按模块的方式进行处理然后再统一打包输出 静态&#xff1a;最终产出的静态资源都可以直接部署到静态资源服务器上进行使用 模…

C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7)

C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7) 前面分析了身体的方向,在这里继续QuantizeFacingsFromSequence属性,这个属性就是通过序列定义文件里获取身体的方向。 根据前面分析可知,同样有一个信息类QuantizeFacingsFromSequenceInfo: [Desc("Deriv…

组件插槽,生命周期,轮播图组件的封装,自定义指令的封装等详解以及axios的卖座案例

3.组件插槽 3-1组件插槽 注意 插槽内容可以访问到父组件的数据作用域,因为插槽内容本身就是在父组件模版中定义的 插槽内容无法访问子组件的数据.vue模版中的表达式只能访问其定义时所处的作用域,这和JavaScript的词法作用域是一致的,换言之: 父组件模版的表达式只能访问父组…

金属压块液压打包机比例阀放大器

液压打包机是机电一体化产品&#xff0c;主要由机械系统、液压控制系统、上料系统与动力系统等组成。整个打包过程由压包、回程、提箱、转箱、出包上行、出包下行、接包等辅助时间组成。市场上液压打包机主要分为卧式与立式两种&#xff0c;立式废纸打包机的体积比较小&#xf…

CI/CD -gitlab

目录 一、常用命令 二、部署 一、常用命令 官网&#xff1a;https://about.gitlab.com/install/ gitlab-ctl start # 启动所有 gitlab 组件 gitlab-ctl stop # 停止所有 gitlab 组件 gitlab-ctl restart # 重启所有 gitlab 组件 gitlab-ctl statu…

Deque继承ArrayDeque和继承LinkedList区别在哪里

在Java中&#xff0c;ArrayDeque和LinkedList都是Deque接口的实现类&#xff0c;但它们的内部实现和性能特性有一些不同。 ArrayDeque&#xff1a; 内部实现&#xff1a;ArrayDeque使用动态数组&#xff08;resizable array&#xff09;来实现&#xff0c;它允许在两端高效地进…

大白话解释什么类加载机制

大家好&#xff0c;我是伍六七。 今天我们来聊聊一个 Java 面试必考基础题目&#xff1a;类加载机制和双亲委派机制。 Java 类的加载机制是 Java 虚拟机&#xff08;JVM&#xff09;中类加载&#xff08;Class Loading&#xff09;和链接&#xff08;Linking&#xff09;的过…

LeetCode27.移除元素(暴力法、快慢指针法)

每日一题&#xff1a;LeetCode27.移除元素 1.问题描述2.解题思路3.代码 1.问题描述 问题描述&#xff1a;给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必…

有趣的按钮分享

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 广告打完&#xff0c;我们进入正题&#xff0c;先看效果&#xff1a; 废话不多&#xff0c;上源码&#xff1a; <button class&quo…

租赁小程序|租赁系统一种新型的商业模式

租赁市场是一个庞大的市场&#xff0c;它由出租人和承租人组成&#xff0c;以及相关的中介机构和供应商等。随着经济的发展和人们对灵活性的需求增加&#xff0c;租赁市场也在不断发展和壮大。特别是在共享经济时代&#xff0c;租赁市场得到了进一步的推动和发展。租赁系统是一…

如何在Docker部署Draw.io绘图工具并远程访问

文章目录 前言1. 使用Docker本地部署Drawio2. 安装cpolar内网穿透工具3. 配置Draw.io公网访问地址4. 公网远程访问Draw.io 前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0…

11 月 11 日 ROS 学习笔记——ROS 架构及概念

文章目录 前言一、 ROS 文件系统级1). 工作空间 Ws2). 功能包3). 消息 msg4). 服务 srv 二、计算图级1). 动态加载节点 nodelet2). 主题 topic3). 服务 srv4). 消息 msg5). 试用练习5). 创建工作空间6). 创建 ROS 功能包和元功能包7). 编译ROS功能包8). 使用 ROS 节点9). 使用主…