• 可能部分图片存在一些我没有发现的问题,你发下图片?

  • 因为你的路径写错了...
    pic/2.png ...

  • opencv-contrib-python 是有影响的,因为特征识别的 SIFT 与 SURF 算法都是有专利的,在新的版本中已经被移除掉了。
    按默认版本来应该没什么问题啊,如果你不想用的话可以把特征识别关掉。模板匹配也够了:

    fi = FindIt(engine=['template'])
    
  • 这个是你的图片不存在吧,sample 里面有图片的

  • 这个是 opencv-python 本身的安装问题,网上有一些解决方案。

    https://blog.csdn.net/wuzhouqingcy/article/details/77509454

    我还没有遇到过,你可以先按网上的方法试试看哈

  • 在 0.4.6 版本之后,非 pro_mode 模式下也会返回相似度了:

    {'data': {'wechat_logo': {'FeatureEngine': {'target_point': [524.6688232421875,
                                                                 364.54248046875]},
                              'TemplateEngine': {'target_point': [505.5, 374.5],
                                                 'target_sim': 0.998754620552063}}},
     'target_name': 'screen',
     'target_path': 'pics/screen.png'}
    

    或者你也可以开启 pro_mode 来获取更多信息:

    fi = FindIt(pro_mode=True)
    

    另外,如果要合入大型的项目其实还是推荐用 findit_client 来解耦:

    https://github.com/williamfzc/findit-client

  • 我用你发的两个图试了下,貌似可以匹配到呢。。
    一般来说默认缩放的 1-3 倍够用了,一般 icon 不会小到太离谱。如果场景很特别,可以根据实际自己算一下看看呢

    1. 第一个是这个东西跟 matchTemplate 的算法直接相关。为了兼容带有蒙版的模板匹配,所以默认的算法是 cv2.TM_CCORR_NORMED。而这个算法的相似度算出来是比较奇怪的,匹配到的话相似度大概会有 0.99+,而没有匹配到的相似度也不会很低,就像你看到的可能也会有 0.95+。
      解决方案也很简单,可以把默认算法换掉:

      fi = FindIt(
          pro_mode=True,
          engine_template_cv_method_name='cv2.TM_CCOEFF_NORMED',
      )
      

      这种算法的表现就正常很多,基本符合人的直觉。但是不兼容蒙版匹配,所以比较纠结。

    2. 另一个可能是你的壁纸太过复杂造成了干扰。很多图像识别算法本质上是根据图像纹理来获取特征的,如果你的壁纸特征太过丰富是可能会影响结果的。一般我是会用纯色背景,不过目前来看比较常规的壁纸也是可以的,但是你这个显然太过复杂了。。

    3. 因为模板匹配与分辨率关联性比较强,所以在匹配时会将你的模板图片进行一定比例的缩放以此寻找最佳匹配点,而默认的缩放比例是 1 倍-3 倍(因为一般来说 icon 都会比较小,而截图分辨率是比较高的)。如果你的模板图片分辨率很高而你的目标图片分辨率低的话,这个 scale 就不是很适用了。我是比较建议用小一点的 icon 搭配大一点的目标图片来检测。如果你一定想要这样检测的话可以这样修改 scale 的值:

      fi = FindIt(
          pro_mode=True,
      
          # 默认是1倍-3倍,该范围内10等分
          # engine_template_scale=(1, 3, 10),
      
          # 这样是0.5倍-3倍,该范围内10等分,可以根据需要自己调节
          # 当然,范围更大,颗粒度更细,就会更慢
          engine_template_scale=(0.5, 3, 10),
      )
      

    如果还存在问题,欢迎继续留言。

  • 是会的,会返回可能性最高的点位。其实最好是打开 pro_mode

    {'data': {'album_logo': {'FeatureEngine': {'raw': [(258.70574951171875,
                                                        57.179443359375),
                                                       (284.8610534667969,
                                                        129.47080993652344),
                                                       (283.2962951660156,
                                                        114.9080810546875),
                                                       (282.82769775390625,
                                                        112.55213928222656),
                                                       (281.9783935546875,
                                                        112.19770050048828)],
                                               'target_point': (282.70079549153644,
                                                                113.21930694580078)},
                             'TemplateEngine': {'raw': {'max_loc': (301.5, 99.0),
                                                        'max_val': 0.9999988079071045,
                                                        'min_loc': (108.5, 63.0),
                                                        'min_val': 0.8840280771255493},
                                                'target_point': (301.5, 99.0),
                                                'target_sim': 0.9999988079071045}},
                              ......
    
     'target_name': 'screen',
     'target_path': 'pics/screen.png'}
    

    会有非常具体的分析结果,可以根据需要去设计自己的逻辑。如,这里的 max_val 就是相似度,可以自己在客户端设定阈值以此判断是否存在该点。

  • 有空的话应该会加上,我这边也有 java 需求

  • 😹 可以,赢在起跑线

  • 贴代码最好用 ``` 括起来,不然看起来还是很乱😂

    minitouch 在建立连接完成之后会打出一些版本信息之类的东西(你可以手动启动 minitouch 看看),在 socket 建立之后应该先把这些信息给去掉或者做特定处理,可以参考pyminitouch/connection.py里的实现。我感觉这个比较符合你说的运行好几次才会执行命令的情况。

  • 看看代码..?

  • 给 adb 加上全局的设备锁 at 2019年04月11日

    😹 对呀 现在确实是这么设计的

    至于为什么用服务器而不是文件与数据库,我的理由是设备状态是个时效性比较强的东西,并不是很有必要进行持久化保存。

  • 一部分哈,速度类还会包括一些扩展的类似页面切换速度、应用启动速度之类的。
    可以啊😄

  • 去翻了一台 4.4 的手机终于复现这个问题了...
    感觉是因为 pycharm 的终端对换行符的错误解析导致的,以前 android 版本的换行符都是\r\r\n

    你可以按照如下步骤看看:

    1. 不要用 pycharm 的终端运行,直接用 cmd 或者 powershell 之类的终端运行。我这边在终端上运行是正常的
    2. 如果要用 pycharm,可以把换行符换掉result = result.replace('\r\r\n', '\r\n')。这么做之后我在 pycharm 上运行也正常
  • 日志展示的是全的对吗?
    然后 result1 是空还是package:com.github.uiautomator\r\r\npackage:com.letv.android.FuseWire\r\r\n呢?
    不过我发现乐视手机上是\r\r\n 换行 其他手机都是\r\n

  • 我手边没有乐视手机,而且没遇到过这种情况..
    你可以试一下:

    1. pip install --upgrade pyatool更新一下版本
    2. 在脚本最前面打开日志(默认是关闭的):PYAToolkit.switch_logger(True)
    3. 看一下日志里的输出是什么样的
  • 那其他的 API 是正常的吗?

  • 这个问题我好像没遇到过 我是测过 oppo、小米

    def show_package(toolkit=None):
        """
        展示设备上所有已安装的包
        :param toolkit:
        :return:
        """
        return toolkit.adb.run(['shell', 'pm', 'list', 'package'])
    

    可以点进去看源码实现的,可以先试一下 adb shell pm list package是不是正常的?乐视的手机我很少见到😹

  • 是的.. 不过这个东西主要也是为了支撑其他工具用 作为中间件存在吧 不然一旦要用 minitouch 都要重新搞一个连接层麻烦死了😹

  • 主要是希望图像识别可以识别到这个点,以支撑其他的工具:https://testerhome.com/topics/16063
    没有该点的话 用户操作暂时无法获取到 所以比较麻烦

  • 😁

  • 😀 主要感觉本来的话 怎么拼接字符串 通信 装指定版本还是挺麻烦的 当然它本身功能还是很好用的

  • 我试了一下好像没问题啊?是因为不是最新版本?

    from pyatool import PYAToolkit
    
    
    d = PYAToolkit('4df189487c7b6fef')
    result = d.show_package()
    print(result)
    
    

    console:

    package:com.sec.android.app.phoneutil
    package:com.android.defcontainer
    package:com.UCMobile
    package:com.sec.android.gallery3d
    package:com.android.phone
    package:com.sec.android.fotaclient