OpenCV学习记录——特征匹配

文章目录


前言

特征匹配是一种图像处理技术,用于在不同图像之间寻找相似的特征点 ,并将它们进行匹配。特征匹配在计算机视觉和图像处理领域中具有广泛的应用,包括目标识别、图像拼接、三维重建等。

一、暴力匹配步骤分析

暴力匹配是一种简单直接的匹配方法,它遍历所有特征点的描述符,并计算它们之间的距离。然后根据距离进行排序,选择距离最短的特征点作为匹配点。虽然暴力匹配方法简单,但在特征点数量较大时计算开销较大。暴力匹配的具体步骤如下:

  1. 特征点检测:首先,使用特征检测算法(如SIFT、SURF、ORB等)在图像中检测出关键点。这些关键点通常位于图像中的显著位置,如角点、边缘等。

  2. 特征描述:对于每个检测到的关键点,计算其周围像素的特征描述符。这些描述符是一组向量,用于描述关键点周围的图像信息。常见的特征描述算法包括SIFT描述符、SURF描述符、ORB描述符等。

  3. 特征匹配:将一组特征点的描述符与另一组特征点的描述符进行匹配。常见的方法是计算描述符之间的距离(如欧氏距离、汉明距离等),并选择距离最近的特征点作为匹配点。

  4. 匹配筛选:对匹配结果进行筛选和排序,通常根据距离进行排序,选择距离最短的特征点作为最佳匹配点。可以使用阈值或其他筛选方法来排除不可靠的匹配。

  5. 匹配验证和优化:对匹配结果进行验证和优化,例如使用RANSAC算法进行模型拟合和外点剔除,以提高匹配的准确性和鲁棒性。

二、代码分析

首先来看一下完整代码如下:

python 复制代码
import cv2
 
img1 = cv2.imread('test.jpg')
img2=cv2.imread('test1.jpg')
 
# 初始化ORB特征点检测器
orb = cv2.ORB_create()
 
# 检测特征点与描述符
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
 
# 创建蛮力(BF)匹配器
bf = cv2.BFMatcher_create(cv2.NORM_HAMMING, crossCheck=True)
 
# 匹配描述符
matches = bf.match(des1,des2)
 
# 画出10个匹配的描述符
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2)
 
cv2.imshow("show",img3)
cv2.waitKey()
cv2.destroyAllWindows()

首先需要注意的是,opencv提供了ORB特征点检测器 ,所以在使用opencv进行特征匹配时,我们通常使用ORB特征检测算法。在进行特征匹配之前要先进行ORB特征点检测器初始化 ,初始化的代码为:orb = cv2.ORB_create()

接下来是其他函数介绍:

(一)检测特征点与描述符函数

python 复制代码
keypoints, descriptors = orb.detectAndCompute(src,mask)

其中的两个参数为:

(1)"src" , 输入图像,可以是灰度图像或彩色图像。

(2)"mask", 掩膜图像,用于指定感兴趣区域。只有在掩膜图像中对应位置为非零值时,才会进行特征检测和描述符计算。

函数返回两个值:

(1)"keypoints", 检测到的关键点列表,每个关键点包含其在图像中的坐标和其他属性。

(2)"descriptors", 关键点的描述符矩阵,每一行对应一个关键点的描述符。

(二)创建 BFMatcher 对象

python 复制代码
cv2.BFMatcher_create(normType, crossCheck)

其中两个参数分别为:

(1)"normType", 可选参数,指定距离度量的类型。默认值为 cv2.NORM_L2,表示使用欧氏距离。还可以选择 cv2.NORM_L1cv2.NORM_HAMMINGcv2.NORM_HAMMING2 等其他距离度量类型

(2)"crossCheck", 可选参数,指定是否进行交叉验证。默认值为 False,表示不进行交叉验证。如果设置为 True,则只有当两个特征点的最佳匹配互为最近邻时,才认为匹配成功

函数返回一个 Brute-Force Matcher 对象,可以用于进行特征匹配

(三)匹配描述符

python 复制代码
bf.match(queryDescriptors,trainDescriptors)

其中的两个参数分别为:

(1)"queryDescriptors", 是需要匹配的图像特征向量

(2)"trainDescriptors", 是被匹配的图像特征向量

(四)画出匹配结果

python 复制代码
cv2.drawMatches(src1,kp1,src2,kp2,match,matchesMask,flags)

(1)"src1", 第一幅图像,通常是查询图像或原始图像

(2)"kp1", 第一幅图像的关键点列表

(3)"src2", 第二幅图像,通常是训练图像或匹配图像

(4)"kp2", 第二幅图像的关键点列表

(5)"match", 匹配结果列表,包含匹配的特征点对

(6)"matchesMask", 是决定需要绘制哪些图像,为空则全部绘制

(7)"flags", 是指定绘图的标志位,0 为全部绘制,2 为绘制 match 匹配 中的,4 为不同的绘制样式

相关推荐
点灯小铭1 分钟前
基于单片机的智能洗碗机设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计
fsnine22 分钟前
图像视觉——颜色识别
图像处理·python·计算机视觉
小张的博客之旅22 分钟前
2025年“羊城杯”网络安全大赛 线上初赛 (WriteUp)
python·学习·网络安全
ShiMetaPi23 分钟前
操作【GM3568JHF】FPGA+ARM异构开发板 使用指南:音频接口
arm开发·嵌入式硬件·fpga开发·rk3568
摘星编程30 分钟前
Trae Solo+豆包Version1.6+Seedream4.0打造“AI识菜通“
人工智能·trae·doubao
FIN666835 分钟前
昂瑞微:射频与模拟芯片领域的国产领军者
前端·人工智能·科技·前端框架·智能
算家计算1 小时前
AI大神100美元手搓ChatGPT!nanochat教程爆火,4小时炼成聊天机器人
人工智能·chatgpt·资讯
Kaydeon1 小时前
【AIGC】50倍加速!NVIDIA蒸馏算法rCM:分数正则化连续时间一致性模型的大规模扩散蒸馏
人工智能·pytorch·python·深度学习·计算机视觉·aigc
阿里云大数据AI技术1 小时前
AI刷新赛事体验,PAI-ArtLab支撑“我的NBA AI手办”互动
人工智能
~无忧花开~1 小时前
JavaScript学习笔记(二十八):JavaScript性能优化全攻略
开发语言·前端·javascript·笔记·学习·性能优化·js