OpenCV特征匹配

1、OpenCV Brute-Force匹配器

Brute-Force匹配器的匹配方法非常简单,输入两张图像对应的特征(特征点坐标与特征点域对应的描述子),循环遍历两幅图像中的特征,计算第一幅图像与第二幅图像之间每个特征之间的距离,然后返回距离最近的特征点对或者返回距离最近的k个特征点对。OpenCV中的Brute-Force特征匹配一般用cv2.BFMatcher类实现,类构建方法定义如下:

cpp 复制代码
cv2.BFMatcher(normType, crossCheck)

normType参数用于指定特征比对的范式,常见的可选的类型与所适应的主要特征检测与描述算法如下:

cs 复制代码
# SIFT、SURF等
normType = cv2.NORM_L2
normType = cv2.NORM_L1

# BRISK、ORB等
normType = cv2.NORM_HAMMING

crossCheck参数为交叉检验参数,约束输出结果的默认的类型为False。若记输出的一对特征点对为(p1,p2),(p1,p2)所对应的特征对为(feature1,feature2),当参数为False时,匹配对(p1,p2)所对应的特征只需要满足下述的条件①;当默认类型调整为True时,则匹配输出的匹配对会更加严格,匹配对(p1,p2)所对应的特征则需要同时满足下述的条件①与条件②。

①第一幅图像中的特征feature1与第二幅图像中的所有的特征比较后与feature2距离最近;

②第二幅图像中的特征feature2与第一幅图像中的所有的特征比较后与feature1距离最近。

下图将两幅图像之间的每个特征点之间的匹配分数做下可视化,横竖分别表示第一幅图与第二幅图,颜色越红则表示距离越近。则条件①表示只需满足一行中颜色最红即可,如匹配对(27,8);而条件①②则表示行列中均满足颜色最红,如匹配对(16,36)。

2、cv2.BFMatcher的两种比对方法

2.1、match方法

match方法输出结果为距离最近的特征点对,输出结果中第一幅图像中每个特征点在第二幅中只有唯一的一个匹配特征点结果。

2.2、knnMatch方法

knnMatch方法输出结果为距离最近的1~k个特征点对,常见的设置为k=2,输出结果中第一幅图像中每个特征点在第二幅图像中可以有1~k个匹配结果。输出的k个匹配对需要进一步处理,从而确定一个特征点对是否是更加可靠的、更加具有特征性的,一般处理方式为比较k个特征点对之间的距离,若距离相近则说明第一幅图像中的对应特征点在第二幅图像中有多个相近的特征点,则说明该对特征点不太能确定这多个相近的特征点中那个才是正确匹配,说明该特征点对不可靠,反之则说明该特征点对匹配结果为更加可靠,可以暂定k对中距离最近的匹配对为正确匹配。

具体的匹配可视化示例如下图所示:

相关推荐
特立独行的猫A14 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
cpolar技术支持14 小时前
「我这边连不上你那个服务」—— 用清单驱动的 TCP 连通性只读看板,cpolar 让远端同事自己取证
python·内网穿透·tcp·cpolar·网络诊断
云和数据.ChenGuang15 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
天诰16 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
benchmark_cc17 小时前
用 QuantDash 读取美股行情:AAPL.US 的运行前检查、排错顺序与数据校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
羲云网络20 小时前
GPT Image 2.6 接入指南:Flare、Sunburst 怎么选,编辑失败如何排查
人工智能·python·aigc·图像生成·acedatacloud
橙橙笔记1 天前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事1 天前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
天天被压力1 天前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力1 天前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python