Python 如果一张图有两个相似的特征点,特征点匹配方法如何区分?

Heroman · 2021年11月15日 · 最后由 Heroman 回复于 2021年12月01日 · 899 次阅读

示例:

如图所示,当我想要匹配 “同意” 字样的按钮时,因为还有一个小字的非按钮 “同意”,也会被匹配到
此时我们能够得到两个左边,但是无法区分那个是我想要点击的按钮
代码如下:

使用的方法是 flann

共收到 12 条回复 时间 点赞
  1. 通过坐标点过滤,比如这个页面的 “同意” 按钮,坐标会更居中,靠下。
  2. 通过置信度过滤,多个返回结果可以优先取最大的一个。
frankxii 回复

第一个方法可行,就是稍微麻烦点,对一些特殊的图需要单独做判断
第二个方法看起来是可以做成统一的限制,但是置信度是什么值?参数名称是什么?我用的是 sift.detectAndCompute 来提取描述子
请指教!

Heroman 回复
  1. 单独处理比较麻烦,可以把判断的部分做成参数,比如加个 side 参数,target = driver.sift_detect(source, side="left"),这样去调用就只判断屏幕左半部分的内容,右边的过滤掉,side 就由自己去设计了,上下左右,居中什么的都可以。

  2. 置信度就是相似度,你用来判断两个物体是否相似的阈值,查出来的结果是一个列表,通过相似度排序后取最大,这样虽然不 100% 准确,但是大多数情况下有效。

frankxii 回复

1.传参也不通用,我这里的场景是遍历一堆图片去和当时的截图一一做匹配,究竟哪一张点击靠左还是靠右是不确定的,所以还是要单独处理
2.置信度我之前用模式匹配是有这个参数的,但是它的弊端是不同分辨率图片不能匹配,现在用 sift 的特征点匹配,查了下好像是没有置信度这个参数的

我觉得啊 既然你都知道界面啥样子了,两个特征点你都能拿到,返回值里面对应的哪个你不是应该很清楚吗,就好比控件识别时候的相同属性的控件,你肯定看到页面之后,知道自己需要点击哪个控件吧,既然这样在获取的控件列表上加个索引不就好了吗?

咸鱼菜鸡 回复

我需要做到的是尽可能通用,这一张图就有很多种情况
在不同的手机上
1.可能会精确匹配同意按钮,有且仅有一个坐标
2.问题中的现象匹配到两个坐标,排序第二个是我要的
3.还会有图中现象在另外的手机上,还是这两个点,因为手机型号不同所以变成了第一个是我要的
手机数量是庞大的,我没办法确定哪个手机是哪一种情况

7楼 已删除

1.knnMatch 更全面的数据展示方式我还得查查,我也觉得改与类似置信度的数据
2.模板匹配用的是 matchTemplate,resize 模板图片的方法使用过了,按照分辨率的缩放比例去缩放模板图片后,缩放后的模板图在目标图内还是完全查找不到

9楼 已删除

我 resize 采用的是,模板图 w* 模板图原始分辨率 w/目标图 w

11楼 已删除

很抱歉,以前用不上特征匹配,对 opencv 特征匹配这块的内容不熟,所以上面的回答有一些误导,今晚重新看了下文档,再回答一下。

  1. 关于我讲的取最大可信度的方法,其实用 flann.match(des1, des2) 就可以,match 方法是取最优结果,knnMatch 通过传入 k 值来取多个结果,我的做法就是用 match 就行了。
  2. 特征匹配这一块,airtest 算是实践相对较多的,去看了一下源码,有题主预期的代码实现,跳过去看就行了。 https://github.com/AirtestProject/Airtest/blob/master/airtest/aircv/sift.py

特征点提取出来后,用模版匹配再算一次

airtest 的用上了,匹配准确度用起来还是稍微有些瑕疵,基本还算能用

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册