谈谈如何使用 opencv 进行图像识别 · TesterHome 您所在的位置:网站首页 opencv画图形 谈谈如何使用 opencv 进行图像识别 · TesterHome

谈谈如何使用 opencv 进行图像识别 · TesterHome

2022-05-26 20:59| 来源: 网络整理| 查看: 265

1)前言

从 18 年开始,我接触了叉叉助手 (平台已经被请喝茶了),通过图色识别,用来给常玩的游戏写挂机脚本,写了也有两三年.也算是我转行当游戏测试的理由. 去年 11 月,也是用了这身技术,混进了外包,薪资还不错,属于是混日子了,岗位是在发行,接触到很多游戏,因为接不了 poco,到手只有 apk, 日积月累,游戏越来越多,项目组却还是只有这点人.为了减轻自己的压力,就开始了 UI 自动化的不归路.

2)游戏 UI 自动化

因为游戏引擎,是无法通过 appium 等框架去获取,如果不接入一些 SDK,那么识别的方法只有图像识别.现在常见的开源框架

网易的 Airtest,通过传统识别进行自动化,还有 airtestIDE 可以简单快速的编写 airtest 代码 腾讯 GameAISDK,通过深度学习进行自动化 (没用过,好久不维护了) 阿里的 SoloPi,主要功能是录制、群控,有图像匹配辅助

图像相关的常见方法:

传统的识别方法: 特征点、模板、轮廓 特征点: SIFT, ORB 下文会详细讲 模板匹配: opencv 的 matchTemplate 最简单的方案,通过讲模板在目标图像中平移,找到最符合的目标 轮廓: HALCON Shape-based Matching, Canny 没用过,写不来,halcon 的要花钱 基于深度学习的方法: 文字识别: PaddleOCR,tesseract paddleOCR 基本上开箱即用,但是对于游戏内的艺术字,还需要额外的训练 图像分类: paddleClas 没有实际用过,感觉可以用在区分场景,然后去做更加详细的识别.比如识别弹窗 目标检测: yolo 之前很火的 Fps 外挂,基本就是靠这个去识别人体

UI 自动化的核心在于查找元素,并且在什么位置.那么重点就会放在图像识别上. 基于深度学习的方案,需要大量的正负样本和标注工作,因此只能放弃.取而代之的是传统的识别方案. 在社区里、qq 的测试群里就能发现,大多数人对传统图像识别的印象是:慢,不准. 今年过年前,去张江面试过一家游戏公司,也是发行公司,聊了一个多小时,聊下来他们的方案是 airtest 一种机型截一个图去做适配.我大受震撼. 总结下来图像识别的 UI 自动化难点:

识别慢 识别结果不准确 多分辨率不兼容性 游戏 UI 更新,管理图片库的成本 3)怎么解决

那么我做了什么,项目就在这里:https://github.com/hakaboom/py_image_registration 目前也是在重构,重构完成后可能起个好名字:https://github.com/hakaboom/image_registration

一开始是参考了 airtest 的 aircv 部分,当时不想有那么多依赖,就拆出来了. 重构之后,通过对 opencv 一些 api 的封装,重新组织了构架和算法.目前效果感觉不错,也已经给 airtest 提了 pr,后续也会推进合并.

安装 opencv-python

建议版本可以是 4.5.5

pypi 上有编译好的,但是只能用 cpu 方法: pip install opencv-python pip install opencv-contrib-python 从源码编译,可以自定义更多的东西,比如增加 cuda 支持 先从 opencv 仓库克隆代码 剩下的看这里 https://github.com/hakaboom/py_image_registration/blob/master/doc/cuda_opencv.md 什么是特征点

简单的理解: 用于描述图像特征的关键点

常见的特征点提取算法:

SIFT: 尺度不变特征变换. opencv 只有 cpu 实现 SURF: surf 的加速算法. opencv 有 cpu 和 cuda 实现 ORB: 使用 FAST 特征检测和 BRIEF 特征描述子. opencv 有 cpu 和 cuda 实现

他们的好处是什么: 尺度和旋转不变性,说白了就是兼容不同分辨率、旋转、尺度的变换 速度排序: ORB(cuda)>SURF(cuda)>ORB>SURF>SIFT 效果排序 (效果不止是特征点的数量,更重要的是特征点的质量): SIFT>ORB>SURF

例子 6.png(2532x1170) iphone12pro 上的截图 4.png(1922x1118 实际游戏渲染是 1920x1080,多出来的是 windows 边框) 崩三桌面端的截图, 裁剪了右上角的蓝色加号区域当模板 import cv2 import time from baseImage import Image, Rect from image_registration.matching import SIFT match = SIFT() im_source = Image('tests/image/6.png') im_search = Image('tests/image/4.png').crop(Rect(1498,68,50,56)) start = time.time() result = match.find_all_results(im_source, im_search) print(time.time() - start) print(result) img = im_source.clone() for _ in result: img.rectangle(rect=_['rect'], color=(0, 0, 255), thickness=3) img.imshow('ret') cv2.waitKey(0)

结果可以得到三个加号的位置

[ {'rect':


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有