Skip to content

SIFT 匹配 ​

节点类型:node-type:/Image/SiftMatch

输入输出 ​

输入名称输入类型输入说明输出名称输出类型输出说明
模板图像要查找的模板图像匹配结果JSON数组模板在图像中的每一次出现
掩码图像模板的掩码,非零像素才参与特征提取;留空则使用整个模板是否匹配布尔找到匹配时为 true,否则为 false
图像图像待搜索的图像首个匹配结果JSON对象匹配结果数组的第一个元素;无结果时为 {}
特征点匹配阈值浮点数特征匹配的筛选强度,取值 0~1,越大越严格
单实例最少内点数整数每个结果至少需要的吻合点数量
最大实例数整数最多输出的结果数量

作用 ​

使用 SIFT 特征在「图像」中查找「模板」,可以识别经过旋转和缩放的目标。结果输出为 JSON 数组,元素包含模板中心在图像中的坐标、旋转角度与缩放倍数。

没有匹配结果时,“匹配结果”为空数组,“是否匹配”为 false,“首个匹配结果”为 {}。“首个匹配结果”在有匹配时与匹配结果数组的第一个元素相同。

「特征点匹配阈值」决定特征匹配的松紧:只有描述子距离不超过该阈值换算出的上限的特征点才会成为候选,值越大筛选越严格,匹配数量会减少,默认 0.9 适合大多数场景。

「单实例最少内点数」是判定「找到了」的门槛:用 RANSAC 估计「平移 + 旋转 + 等比缩放」变换后,与该变换相符的特征点称为内点(吻合点),内点数少于该值的结果会被丢弃。模板纹理较少时,可以适当调小;误匹配较多时,可以适当调大。

模板在图像中出现多次时,每个位置都会输出一个元素:每找到一个结果,就在剩下的特征点里继续查找下一个,最多输出「最大实例数」个结果。结果按查找顺序排列,通常吻合点最多的位置排在前面。

输出示例 ​

匹配结果 ​

「匹配结果」输出连接器(类型:JSON数组)的输出示例:

json
[
  {
    "center": { "x": 320.5, "y": 240 },
    "angle": 12.4,
    "scale": 0.87
  },
  {
    "center": { "x": 1180, "y": 705.5 },
    "angle": -3.1,
    "scale": 0.87
  }
]

数组元素各字段含义:

字段类型说明
center二维浮点数向量模板中心在图像中的坐标
angle浮点数旋转角度(度),正值表示逆时针
scale浮点数相对模板的缩放倍数,1 表示大小不变

是否匹配 ​

「是否匹配」输出连接器(类型:布尔)在找到匹配时输出:

text
true

没有匹配时为:

text
false

首个匹配结果 ​

「首个匹配结果」输出连接器(类型:JSON对象)输出与匹配结果数组第一项相同:

json
{
  "center": { "x": 320.5, "y": 240 },
  "angle": 12.4,
  "scale": 0.87
}

没有匹配时为:

json
{}

需要目标数量时使用「数组/元素数量」读取“匹配结果”的长度,结果为 0 表示没有匹配。

注意事项 ​

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