ORB 匹配
节点类型:node-type:/Image/OrbMatch
输入输出
| 输入名称 | 输入类型 | 输入说明 | 输出名称 | 输出类型 | 输出说明 |
|---|---|---|---|---|---|
| 模板 | 图像 | 要查找的模板图像 | 匹配结果 | JSON数组 | 模板在图像中的每一次出现 |
| 掩码 | 图像 | 模板的掩码,非零像素才参与特征提取;留空则使用整个模板 | 是否匹配 | 布尔 | 找到匹配时为 true,否则为 false |
| 图像 | 图像 | 待搜索的图像 | 首个匹配结果 | JSON对象 | 匹配结果数组的第一个元素;无结果时为 {} |
| 特征点匹配阈值 | 浮点数 | 特征匹配的筛选强度,取值 0~1,越大越严格 | |||
| 单实例最少内点数 | 整数 | 每个结果至少需要的吻合点数量 | |||
| 最大实例数 | 整数 | 最多输出的结果数量 |
作用
使用 ORB 特征在「图像」中查找「模板」,可以识别经过旋转的目标。结果输出为 JSON 数组,元素包含模板中心在图像中的坐标、旋转角度与缩放倍数(本节点恒为 1)。
没有匹配结果时,“匹配结果”为空数组,“是否匹配”为 false,“首个匹配结果”为 {}。“首个匹配结果”在有匹配时与匹配结果数组的第一个元素相同。
ORB 不能匹配缩放后的目标:目标被放大或缩小后就找不到。需要识别缩放后的目标,请改用「SIFT 匹配」节点。
「特征点匹配阈值」决定特征匹配的松紧:ORB 使用二进制描述子,只有汉明距离不超过该阈值换算出的上限的特征点才会成为候选,值越大筛选越严格,匹配数量会减少,默认 0.9 适合大多数场景。
「单实例最少内点数」是判定「找到了」的门槛:用 RANSAC 估计「平移 + 旋转」变换后,与该变换相符的特征点称为内点(吻合点),内点数少于该值的结果会被丢弃。模板纹理较少时,可以适当调小;误匹配较多时,可以适当调大。
模板在图像中出现多次时,每个位置都会输出一个元素:每找到一个结果,它的内点会从剩余匹配中移除,再继续查找下一个,最多输出「最大实例数」个结果。结果按查找顺序排列,通常吻合点最多的位置排在前面。
输出示例
匹配结果
「匹配结果」输出连接器(类型:JSON数组)的输出示例:
json
[
{
"center": { "x": 320.5, "y": 240 },
"angle": 12.4,
"scale": 1
},
{
"center": { "x": 1180, "y": 705.5 },
"angle": -3.1,
"scale": 1
}
]数组元素各字段含义:
| 字段 | 类型 | 说明 |
|---|---|---|
| center | 二维浮点数向量 | 模板中心在图像中的坐标 |
| angle | 浮点数 | 旋转角度(度),正值表示逆时针 |
| scale | 浮点数 | 缩放倍数,本节点恒为 1 |
是否匹配
「是否匹配」输出连接器(类型:布尔)在找到匹配时输出:
text
true没有匹配时为:
text
false首个匹配结果
「首个匹配结果」输出连接器(类型:JSON对象)输出与匹配结果数组第一项相同:
json
{
"center": { "x": 320.5, "y": 240 },
"angle": 12.4,
"scale": 1
}没有匹配时为:
json
{}需要目标数量时使用「数组/元素数量」读取“匹配结果”的长度,结果为 0 表示没有匹配。
注意事项
- 输出只有位置、角度和缩放,没有相似度分数:需要比较「像不像」时,可以结合「模板匹配」节点,或在输出的位置上自行比较像素。
- ORB 比 SIFT 快,但要求目标和模板大小一致、对旋转的容忍度也更低:目标缩放变化、画面模糊或光照变化剧烈时可能匹配不到,这时可以改用「SIFT 匹配」节点。
- 与「模板匹配」节点相比,本节点支持旋转,但要求目标有足够的纹理;纯色按钮、大面积同色区域的特征点很少,可能匹配不到。
- 表格、平铺花纹、重复文字等重复纹理可能出现匹配到错误位置的情况,建议提高「单实例最少内点数」或提高「特征点匹配阈值」。
- 模板和图像都需要是 8 位图像(单通道、三通道或四通道均可),其它类型会报错;两者都会先转换为灰度图再提取特征。
- 判定内点使用的是固定的重投影误差阈值(3 像素),不随输入变化。
- 结果基于「平移 + 旋转」估计,目标存在透视或斜切时,角度是近似值。