Skip to content

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 表示没有匹配。

注意事项 ​

  1. 输出只有位置、角度和缩放,没有相似度分数:需要比较「像不像」时,可以结合「模板匹配」节点,或在输出的位置上自行比较像素。
  2. ORB 比 SIFT 快,但要求目标和模板大小一致、对旋转的容忍度也更低:目标缩放变化、画面模糊或光照变化剧烈时可能匹配不到,这时可以改用「SIFT 匹配」节点。
  3. 与「模板匹配」节点相比,本节点支持旋转,但要求目标有足够的纹理;纯色按钮、大面积同色区域的特征点很少,可能匹配不到。
  4. 表格、平铺花纹、重复文字等重复纹理可能出现匹配到错误位置的情况,建议提高「单实例最少内点数」或提高「特征点匹配阈值」。
  5. 模板和图像都需要是 8 位图像(单通道、三通道或四通道均可),其它类型会报错;两者都会先转换为灰度图再提取特征。
  6. 判定内点使用的是固定的重投影误差阈值(3 像素),不随输入变化。
  7. 结果基于「平移 + 旋转」估计,目标存在透视或斜切时,角度是近似值。