测试质量保障计算机视觉【免费下载链接】AirtestUI Automation Framework for Games and Apps项目地址https://gitcode.com/gh_mirrors/ai/Airtest点击查看免费下载导读airtest.aircv.sift是 Airtest 开源 UI 自动化框架项目主页中基于 SIFT尺度不变特征变换特征点匹配的图像识别实现模块。它通过提取截图与模板图像的关键点和描述子、以 FLANN 近邻匹配筛选特征点对并根据匹配点对数量分级推断目标区域最终给出与find_template相同格式的识别结果中心点、矩形角点与置信度。读完本文你将掌握find_sift的完整参数语义、匹配点对数量对应的四种目标区域推算策略、SIFT 置信度的放水修正机制以及在 AirtestCVSTRATEGY匹配策略中启用 SIFT 的实战配置方法。模块定位SIFT 在 Aircv 识别体系中的角色sift.pyairtest/aircv/sift.py是 Airtest 图像识别模块aircv的一员。aircv的公开入口airtest/aircv/__init__.py显式导出了三个核心识别能力find_siftSIFT 特征点匹配来自sift.pyfind_template/find_all_template模板匹配来自template.pyaircv.py中的imread/imwrite等基础图像 IO 工具。在 Airtest 的airtest/core/cv.py中MATCHING_METHODS注册表将sift映射到面向对象的封装类SIFTMatchingairtest/aircv/keypoint_matching_contrib.py与tpl、mstpl、gmstpl、kaze、brisk、akaze、orb、surf、brief并列构成完整识别方法集合。测试文件 tests/test_aircv.py 中既有针对函数式接口find_sift(...)的用例test_contrib_func_find_sift也有针对类式接口SIFTMatching(...).find_best_result()的用例test_contrib_find_sift并在注释中给出了开发者的横向对比结论单纯效果推荐程度tpl surf ≈ sift kaze brisk akaze brief orb同时指出 SIFT 在 2960×1440 高分辨率设备上内存占用较大kaze (2GB) sift akaze ...。这意味着 SIFT 适用于纹理丰富、需要抵抗旋转/缩放/光照变化的场景而低内存设备上应谨慎使用。核心入口 find_sift参数与返回结构函数式接口的完整签名如下def find_sift(im_source, im_search, threshold0.8, rgbTrue, good_ratioFILTER_RATIO): 基于sift进行图像识别只筛选出最优区域.各参数含义与默认值参数默认值含义im_source必填大图通常是设备截图OpenCV 的 numpy 图像矩阵可用aircv.imread读取im_search必填小图待查找的模板/目标同样为图像矩阵threshold0.8置信度阈值最终 confidence 不小于该值才返回结果否则返回NonergbTrue置信度计算方式True走 RGB/HSV 三通道相似度False走灰度TM_CCOEFF_NORMEDgood_ratio0.59优秀特征点过滤比例0~1源码注释建议 0.4~0.6用于剔除不独特的匹配返回结构与模板匹配完全一致由generate_result生成见 airtest/aircv/utils.py{ result: (middle_x, middle_y), # 识别目标中心点在 im_source 中的坐标 rectangle: [(x1, y1), (x2, y2), ...], # 目标矩形四个角点 confidence: 0.85, # 0~1 之间的相似度 }模块级还有两个可调常量airtest/aircv/sift.pyFLANN_INDEX_KDTREE 0、FLANN cv2.FlannBasedMatcher({algorithm: FLANN_INDEX_KDTREE, trees: 5}, dict(checks50))FLANN 快速最近邻匹配器KDTree 索引 5 棵树、50 次检查ONE_POINT_CONFI 0.5当只找到一对匹配特征点时赋予的固定置信度。匹配流程从特征点提取到目标区域推算find_sift内部按清晰的四步流水线执行_get_key_points与各_handle_*/_many_good_pts分工明确。第一步图像合法性校验check_image_validairtest/aircv/utils.py确保im_source与im_search均为非空、非全零的矩阵否则直接返回None。第二步特征点提取与匹配_init_sift()负责初始化 SIFT 算子并处理不同 OpenCV 版本差异OpenCV 3.xSIFT 位于 contrib 扩展模块尝试cv2.xfeatures2d.SIFT_create(edgeThreshold10)失败则抛出NoSIFTModuleError提示需要自行编译带 contrib 的 OpenCV其他版本如 2.x直接使用cv2.SIFT(edgeThreshold10)。随后对im_search与im_source分别执行detectAndCompute得到特征点kp_sch/kp_src与描述子des_sch/des_src。若任一图特征点少于 2 个直接抛出NoSiftMatchPointErrorNot enough feature points in input images !。匹配采用FLANN.knnMatch(des_sch, des_src, k2)为每个特征点取距离最近的两个候选然后按Lowe 比率测试过滤for m, n in matches: if m.distance good_ratio * n.distance: good.append(m)即最近距离与次近距离之比小于 0.59 才算优秀匹配该机制剔除了一对多中区分度不足的特征点。最后还有一步去重允许小图对源图一对多映射但不允许多对一同一源图坐标被多个匹配引用从源码注释看这一设计明确表明 SIFT 匹配多目标识别情况直接不适用这也解释了mask_sift与find_all_sift目前均为raise NotImplementedError占位的原因。第三步按匹配点对数量分策略推算目标区域len(good)决定四种处理分支0 对无法提取识别区域返回None1 对_handle_one_good_points识别中心直接取该匹配点在im_source中的坐标置信度固定为ONE_POINT_CONFI 0.5矩形四角全部等于中心点区域无效化。仅当0.5 threshold时才返回结果——因此默认threshold0.8时单点匹配必然返回None2 对_handle_two_good_points以两对特征点计算 x/y 轴缩放比例x_scale、y_scale把小图尺寸按比例扩张成目标矩形并基于映射矩阵中点对中心点进行校正若两特征点共 x 轴或共 y 轴无法确定方向则退化为单点情形置信度 0.53 对_handle_three_good_points取第 1 点与第 2、3 点中点构造两个等效点复用两点算法推算区域≥4 对_many_good_pts使用 RANSAC 求解单应矩阵先以cv2.findHomography(sch_pts, img_pts, cv2.RANSAC, 5.0)剔除离群点_find_homography失败抛HomographyError再用内点重新拟合矩阵最后对小图四角做cv2.perspectiveTransform映射得到目标矩形顶点。映射结果若越出源图边界会被裁剪到边界并且通过取左上-右下两个顶点的 min/max 保证翻转矩阵下矩形方向正确。第四步结果校验、置信度计算与阈值判定_target_error_check做两条合理性硬校验违规直接raise SiftResultCheckError目标矩形宽或高小于 5 像素判定识别失效目标区域宽高与小图差距超过 5 倍或小于 0.2 倍屏幕像素差不可能有 5 倍判定识别错误。校验通过后从im_source裁剪出目标区域并cv2.resize到与小图一致再计算置信度。SIFT 的置信度在底层相似度之上还有放水修正_cal_sift_confidenceif rgb: confidence cal_rgb_confidence(resize_img, im_search) else: confidence cal_ccoeff_confidence(resize_img, im_search) # sift的confidence要放水 confidence (1 confidence) / 2cal_rgb_confidenceairtest/aircv/cal_confidence.py将两张图转 HSV 后对三通道分别做cv2.matchTemplate(..., cv2.TM_CCOEFF_NORMED)取三通道最大值中的最小值作为 RGB 相似度cal_ccoeff_confidence则直接对灰度图做归一化相关系数匹配取最大值。两者计算前都会copyMakeBorder扩边 10 像素并注入极值像素防止算法过度放大微小差异。(1 confidence) / 2将 TM_CCOEFF_NORMED 的 [-1, 1] 区间映射到 [0, 1]使结果更符合置信度的直觉。最后confidence threshold才返回best_match否则返回None匹配成功后还会打印日志[aircv][sift] threshold%s, result%s。SIFT 异常体系find_sift涉及的全部异常都定义在 airtest/aircv/error.py继承自BaseError异常类触发场景NoSIFTModuleError当前 OpenCV 3.x 环境缺少 contrib 模块无法创建 SIFT 算子NoSiftMatchPointError输入图像特征点少于 2 个knnMatch 需要 k2HomographyErrorfindHomography调用失败或返回空 maskSiftResultCheckError目标区域宽/高 5 像素或与小图尺寸相差超过 5 倍调用方通常需要捕获BaseError系列异常做降级处理Airtest 的cv.py匹配策略循环正是这样做的_try_match捕获aircv.BaseError后记录 debug 日志并返回None继续尝试策略链中的下一个方法。面向对象封装SIFTMatching 与 CVSTRATEGY 集成SIFTMatchingairtest/aircv/keypoint_matching_contrib.py继承KeypointMatching基类将同样的算法组织为类方法并针对 OpenCV 版本做了更细的分支较sift.py的_init_sift更新新版 OpenCV≥3.4.12 或 ≥4.5.0SIFT 已移入主库优先cv2.SIFT_create(edgeThreshold10)AttributeError 时回退到cv2.xfeatures2d.SIFT_create仍失败则抛NoModuleError提示需要 contrib 模块匹配器同样是FlannBasedMatcher KDTree5 棵树、50 次检查。要在 Airtest 脚本中让 SIFT 参与自动匹配可通过settings.py的CVSTRATEGY指定策略顺序from airtest.core.settings import Settings as ST ST.CVSTRATEGY [sift, mstpl, tpl] # 优先 SIFT失败后回退airtest/core/cv.py的匹配循环会依次执行策略中的方法未知方法名会抛出InvalidMatchingMethodError并提示可选值kaze/brisk/akaze/orb/surf/sift/brief。SIFT 是 contrib 方法若环境未安装 opencv-contrib_try_match会捕获NoModuleError并输出警告surf/sift/brief is in opencv-contrib module. You can use tpl/kaze/brisk/akaze/orb in CVSTRATEGY, or reinstall opencv with the contrib module.随后自动跳过继续尝试下一策略。直接使用函数式接口的示例与测试用例 tests/test_aircv.py 一致from airtest.aircv import imread, find_sift screen imread(screen.png) # 设备截图im_source target imread(target.png) # 待查找的模板im_search result find_sift(screen, target, threshold0.7, rgbTrue) if result: print(center:, result[result]) print(rectangle:, result[rectangle]) print(confidence:, result[confidence]) else: print(not found)边界条件与使用建议综合源码实现可以总结出以下实用边界必须安装带 contrib 的 OpenCV或新版主库 OpenCVOpenCV 3.x 官方发行版不包含 SIFT需要在 requirements.txt 之外额外安装opencv-contrib-python否则_init_sift会抛出NoSIFTModuleErrorSIFTMatching会抛出NoModuleError输入图像需有足够特征点特征点少于 2 个会抛NoSiftMatchPointError纯色、模糊、低纹理图像不适合 SIFT默认阈值下单点匹配不可用单对特征点置信度固定为 0.5只有threshold 0.5才会返回结果默认 0.8 下直接返回None不适用于多目标查找find_all_sift与mask_sift均为raise NotImplementedError多目标场景应改用find_all_template计算开销较大测试注释显示 SIFT 内存占用高于多数方法高分辨率截图上应权衡性能可考虑将 SIFT 排在CVSTRATEGY靠后位置作为兜底方案置信度语义返回值经过(1 confidence) / 2修正且rgbTrue时取三通道相似度最小值对颜色差异更敏感实际调参时可据此选择rgb取值与threshold。小结airtest.aircv.sift用约 280 行代码完整实现了特征点提取 → FLANN 匹配 → Lowe 比率过滤 → 按匹配点数分级推算 → 结果校验与置信度修正的 SIFT 识别链路并通过函数式find_sift与类式SIFTMatching双接口、CVSTRATEGY策略注册表无缝接入 Airtest 的图像识别框架。理解其参数threshold/rgb/good_ratio与四种匹配点分支行为是在游戏与 App 自动化中用好这一旋转/缩放不变匹配方案的关键。赞分享测试质量保障计算机视觉【免费下载链接】AirtestUI Automation Framework for Games and Apps项目地址https://gitcode.com/gh_mirrors/ai/Airtest点击查看免费下载相关推荐Airtest 图像识别算法性能基准测试指南特征点匹配方法对比与 benchmark 工具实战Airtest 图像识别算法性能基准测试指南特征点匹配方法对比与 benchmark 工具实战 本文以 benchmark/README.md https:/测试质量保障计算机视觉Airtest 特征点匹配基类 KeypointMatching 深度解析KAZE 识别框架与源码级原理Airtest 特征点匹配基类 KeypointMatching 深度解析KAZE 识别框架与源码级原理 导读 本文围绕 Airtest 图像识别体系中的特征测试质量保障计算机视觉计算机视觉特征匹配终极指南SIFT、SURF算法原理与opencv4nodejs实战计算机视觉特征匹配终极指南SIFT、SURF算法原理与opencv4nodejs实战 在当今数字化时代计算机视觉技术正以前所未有的速度改变着我们与世界交互的计算机视觉人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考