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 为不同的绘制样式

相关推荐
Deepoch1 小时前
Deepoc 大模型在无人机行业应用效果的方法
人工智能·科技·ai·语言模型·无人机
Deepoch1 小时前
Deepoc 大模型:无人机行业的智能变革引擎
人工智能·科技·算法·ai·动态规划·无人机
kngines1 小时前
【字节跳动】数据挖掘面试题0003:有一个文件,每一行是一个数字,如何用 MapReduce 进行排序和求每个用户每个页面停留时间
人工智能·数据挖掘·mapreduce·面试题
Binary_ey1 小时前
AR衍射光波导设计遇瓶颈,OAS 光学软件来破局
人工智能·软件需求·光学软件·光波导
昵称是6硬币1 小时前
YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目标检测论文精读(逐段解析)
图像处理·人工智能·深度学习·yolo·目标检测·计算机视觉
平和男人杨争争2 小时前
机器学习2——贝叶斯理论下
人工智能·机器学习
静心问道2 小时前
XLSR-Wav2Vec2:用于语音识别的无监督跨语言表示学习
人工智能·学习·语音识别
算家计算2 小时前
5 秒预览物理世界,2 行代码启动生成——ComfyUI-Cosmos-Predict2 本地部署教程,重塑机器人训练范式!
人工智能·开源
摆烂工程师2 小时前
国内如何安装和使用 Claude Code 教程 - Windows 用户篇
人工智能·ai编程·claude
云天徽上9 天前
【目标检测】图像处理基础:像素、分辨率与图像格式解析
图像处理·人工智能·目标检测·计算机视觉·数据可视化