004 OpenCV akaze特征点检测匹配

这篇具有很好参考价值的文章主要介绍了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+02
	3.3443473e-01   1.0143901e+00  -7.6999973e+01
	3.4663091e-04  -1.4364524e-05   1.0000000e+00 </data></H13>
</opencv_storage>

akaze特征代码,OpenCV,opencv,计算机视觉,人工智能,算法akaze特征代码,OpenCV,opencv,计算机视觉,人工智能,算法

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.pt

    col = 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()

akaze特征代码,OpenCV,opencv,计算机视觉,人工智能,算法文章来源地址https://www.toymoban.com/news/detail-781534.html

到了这里,关于004 OpenCV akaze特征点检测匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 特征点的检测与匹配(ORB,SIFT,SURFT比较)[opencv-python]

    本文旨在总结opencv-python上特征点的检测和匹配。 1、特征点的检测(包括:ORB,SIFT,SURFT) 2、特侦点匹配方法 (包括:暴力法,FLANN,以及随机抽样一致性优化RANSAC算法) 注:由于SURF专利问题,所以opencv官方包目前不支持SURF但支持ORB和SIFT,安装opencv-contrib-python包就可以解决 一

    2024年02月06日
    浏览(47)
  • openCV实战-系列教程7:轮廓检测2与模板匹配(轮廓检测/轮廓特征/轮廓近似/轮廓边界矩阵/轮廓边界圆/模版匹配)、原理解析、源码解读

    打印一个图片可以做出一个函数: 前面我们计算了这个图片的轮廓:  它的轮廓信息保存在了contours中,取出第一个轮廓,计算相关参数: 打印结果: 8500.5  437.9482651948929 这是分别求出了周长和面积,这里的True表示的是否是闭合的。    如图,第一个图是原图,如果将它的

    2024年02月10日
    浏览(40)
  • opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

    矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以表示图像的中心、尺度

    2024年02月13日
    浏览(40)
  • 【计算机视觉、关键点检测、特征提取和匹配】基于SIFT、PCA-SIFT和GLOH算法在不同图像之间建立特征对应关系,并实现点匹配算法和图像匹配(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年03月14日
    浏览(51)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(318)
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪(代码+视频)

    计算机视觉、深度学习和机器学习是当今最热门的技术,它们被广泛应用于各种领域,如自动驾驶、医学图像分析、安防监控等。而目标检测跟踪技术则是计算机视觉中的一个重要分支,它可以帮助我们在图像或视频中自动识别和跟踪特定的目标。 下面我们来一一介绍这些技

    2024年02月01日
    浏览(107)
  • OpenCV之特征点匹配

            特征点探测方法有goodFeaturesToTrack(),cornerHarris()和SURF()。一般使用goodFeaturesToTrack()就能获得很好的特征点。goodFeaturesToTrack()定义: image:源图像; corners:检测到的特征点位置; maxcorner:为返回的特征点个数设置上限。 qualityLevel:反映出一个角形特征在它之前的强度,设

    2024年02月12日
    浏览(36)
  • opencv特征匹配算法原理

    算法步骤: FAST进行特征点提取是根据当前点领域内的点的差值作为特征点的筛选标准 ( 1 ) 选择像素 p ,该像素值为 I p ,确定筛选阈值 T ( 2 ) 计算以 p 为圆心 3 为半径的 16 个像素点的灰度值 I x 和圆心 p 的灰度值 I p 的差值,如果存在连续 n 个点(算法第一个版本为 12 ) 满

    2024年02月03日
    浏览(43)
  • OpenCV实战(18)——特征匹配

    在关键点检测一节中,我们学习了如何检测图像中的关键点,其目的是用于执行局部图像分析。这些关键点需要足够独特,以便在具有相同对象的不同图像中能够检测到相同的点。 基于关键点执行图像分析需要构建丰富的表示来唯一地描述这些关键点,本节将重点介绍如何从

    2024年02月03日
    浏览(43)
  • opencv学习-特征匹配

    opencv特征匹配方法有两种,分别是: BF(Brute-Force),暴力特征匹配方法。它使用第一组中的每个特征的描述子,与第二组中的所有特征描述子进行匹配,计算它们之间的差距,然后将最接近一个匹配返回。 在进行批量特征匹配时,FLANN速度更快。 由于它使用的是邻近近似值

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包