 | |  |  |
AIWROK软件苹果系统找图方法完整示例集合
- // 苹果系统找图方法汇集示例
- // 交流QQ群711841924
- // 苹果系统找图方法完整示例集合
- function sleep(ms) {
- return new Promise(resolve => setTimeout(resolve, ms));
- }
- function main() {
- printl("========== 苹果系统找图方法汇集示例 ==========\n");
- example1_findImagesEx(); // 示例1: CV文件模板匹配找图(最基础用法)
- example2_findImages(); // 示例2: 多图查找(支持超时和质量设置)
- example3_templateMatch(); // 示例3: 多模板匹配查找
- example4_findImagesEx_multi(); // 示例4: 单CV文件查找多个目标
- example5_findImages_region(); // 示例5: 指定区域找图
- example6_findImages_timeout(); // 示例6: 带超时的找图
- example7_templateMatch_best(); // 示例7: 只返回最佳匹配
- example8_findImages_quality(); // 示例8: 不同截图质量的找图
- example9_templateMatch_region(); // 示例9: 指定区域的模板匹配
- example10_findImages_threshold(); // 示例10: 不同相似度阈值的找图
- example11_comprehensive_flow(); // 示例11: 综合自动化流程(实战案例)
- printl("\n========== 所有示例执行完毕 ==========");
- }
- // 方法一:findImagesEx - CV文件模板匹配找图(最基础用法)
- function example1_findImagesEx() {
- printl("【示例1】findImagesEx - CV文件模板匹配找图");
- printl("适用场景:查找单个图片模板,最简单直接的找图方法");
- printl("演示效果:交替点击两个不同的目标");
- printl("等待2秒确保屏幕加载完成...");
- sleep(2000);
-
- try {
- var detects1 = opencv.findImagesEx('图色769598.cv');
- if (detects1 != null && detects1.length > 0) {
- printl("✓ 找到目标1,数量: " + detects1.length);
- var rect1 = detects1[0].getRect();
- printl("目标1中心点: x=" + rect1.getCenterX() + ", y=" + rect1.getCenterY());
- printl("点击目标1");
- detects1[0].clickRandom();
- sleep(1000);
- } else {
- printl("✗ 未找到目标1,等待1秒后重试...");
- sleep(1000);
- detects1 = opencv.findImagesEx('图色769598.cv');
- if (detects1 != null && detects1.length > 0) {
- printl("✓ 重试后找到目标1,数量: " + detects1.length);
- var rect1 = detects1[0].getRect();
- printl("目标1中心点: x=" + rect1.getCenterX() + ", y=" + rect1.getCenterY());
- printl("点击目标1");
- detects1[0].clickRandom();
- sleep(1000);
- } else {
- printl("✗ 重试后仍未找到目标1");
- }
- }
- var detects2 = opencv.findImagesEx('图色781849.cv');
- if (detects2 != null && detects2.length > 0) {
- printl("✓ 找到目标2,数量: " + detects2.length);
- var rect2 = detects2[0].getRect();
- printl("目标2中心点: x=" + rect2.getCenterX() + ", y=" + rect2.getCenterY());
- printl("点击目标2");
- detects2[0].clickRandom();
- sleep(1000);
- } else {
- printl("✗ 未找到目标2");
- }
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法二:findImages - 多图查找(支持超时和质量设置)
- function example2_findImages() {
- printl("【示例2】findImages - 多图查找");
- printl("适用场景:同时查找多张相似图片,支持设置超时和截图质量");
- try {
- var targetImages = ['图色769598.cv', '图色769599.cv'];
- var multiFindResults = opencv.findImages(targetImages, 0.7, 3000, 1, [0, 0, 1, 1]);
-
- if (multiFindResults != null) {
- printl("多图查找成功,找到目标数量: " + multiFindResults.length);
- for (var i = 0; i < Math.min(3, multiFindResults.length); i++) {
- printl("目标" + i + ": x=" + multiFindResults[i].x + ", y=" + multiFindResults[i].y);
- }
-
- if (multiFindResults.length > 0) {
- printl("点击第一个目标");
- multiFindResults[0].clickRandom();
- }
- } else {
- printl("多图查找超时或失败");
- }
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法三:templateMatch - 多模板匹配查找目标对象
- function example3_templateMatch() {
- printl("【示例3】templateMatch - 多模板匹配查找");
- printl("适用场景:基于多个模板图片在指定图像中匹配目标,可设置匹配区域、阈值等");
- try {
- var image = screen.screenShotFull();
- var mat = image.getMat();
-
- var templates = ['图色769598.cv', '图色769599.cv'];
- var matchResults = opencv.templateMatch(mat, templates, 0.8, [0, 0, 1, 1], false);
-
- if (matchResults != null && matchResults.length > 0) {
- printl("模板匹配成功,找到目标数量: " + matchResults.length);
- for (var i = 0; i < Math.min(3, matchResults.length); i++) {
- printl("目标" + i + ": x=" + matchResults[i].x + ", y=" + matchResults[i].y +
- ", width=" + matchResults[i].width + ", height=" + matchResults[i].height);
- }
-
- printl("点击第一个目标");
- matchResults[0].clickRandom();
- } else {
- printl("模板匹配未找到目标");
- }
-
- mat.close();
- image.close();
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法四:findImagesEx - 单CV文件查找多个目标
- function example4_findImagesEx_multi() {
- printl("【示例4】findImagesEx - 单CV文件查找多个目标");
- printl("适用场景:屏幕中存在多个相同的目标,需要全部找到");
- printl("注意:此示例在示例1执行后运行,屏幕状态可能已改变");
- try {
- var detects = opencv.findImagesEx('图色769598.cv');
- if (detects != null && detects.length > 0) {
- printl("找到 " + detects.length + " 个目标");
-
- for (var i = 0; i < detects.length; i++) {
- var rect = detects[i].getRect();
- printl("目标" + i + ": 中心点 x=" + rect.getCenterX() + ", y=" + rect.getCenterY());
- }
-
- printl("点击所有目标");
- for (var i = 0; i < detects.length; i++) {
- detects[i].clickRandom();
- sleep(500);
- }
- } else {
- printl("未找到目标");
- }
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法五:findImages - 指定区域找图
- function example5_findImages_region() {
- printl("【示例5】findImages - 指定区域找图");
- printl("适用场景:只在屏幕的特定区域查找目标,提高查找效率");
- try {
- var targetImages = ['图色769598.cv'];
-
- var region = [0.2, 0.2, 0.8, 0.8];
- printl("查找区域: [" + region.join(", ") + "]");
- printl("说明:区域坐标为百分比,[0.2, 0.2, 0.8, 0.8] 表示从屏幕20%位置开始查找");
-
- var regionResults = opencv.findImages(targetImages, 0.7, 3000, 1, region);
-
- if (regionResults != null) {
- printl("在指定区域内找到 " + regionResults.length + " 个目标");
- if (regionResults.length > 0) {
- regionResults[0].clickRandom();
- }
- } else {
- printl("指定区域内未找到目标");
- }
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法六:findImages - 带超时的找图
- function example6_findImages_timeout() {
- printl("【示例6】findImages - 带超时的找图");
- printl("适用场景:设置查找超时时间,避免长时间等待");
- try {
- var targetImages = ['图色769598.cv'];
-
- printl("开始查找,超时时间: 5000毫秒");
- printl("说明:如果5000毫秒内未找到目标,将返回null");
-
- var timeoutResults = opencv.findImages(targetImages, 0.7, 5000, 1, [0, 0, 1, 1]);
-
- if (timeoutResults != null) {
- printl("在超时前找到目标");
- timeoutResults[0].clickRandom();
- } else {
- printl("查找超时,未找到目标");
- }
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法七:templateMatch - 只返回最佳匹配
- function example7_templateMatch_best() {
- printl("【示例7】templateMatch - 只返回最佳匹配");
- printl("适用场景:只关心最匹配的结果,忽略其他匹配项");
- try {
- var image = screen.screenShotFull();
- var mat = image.getMat();
-
- var templates = ['图色769598.cv', '图色769599.cv'];
-
- printl("查找最佳匹配(best=true)");
- printl("说明:只返回相似度最高的一个匹配结果");
-
- var bestMatch = opencv.templateMatch(mat, templates, 0.8, [0, 0, 1, 1], true);
-
- if (bestMatch != null && bestMatch.length > 0) {
- printl("找到最佳匹配: x=" + bestMatch[0].x + ", y=" + bestMatch[0].y);
- bestMatch[0].clickRandom();
- } else {
- printl("未找到最佳匹配");
- }
-
- mat.close();
- image.close();
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法八:findImages - 不同截图质量的找图
- function example8_findImages_quality() {
- printl("【示例8】findImages - 不同截图质量的找图");
- printl("适用场景:根据需求选择不同的截图质量,平衡速度和准确度");
- try {
- var targetImages = ['图色769598.cv'];
-
- printl("测试不同截图质量:");
- printl("质量0(标清):速度快,适合快速查找");
- var result0 = opencv.findImages(targetImages, 0.7, 3000, 0, [0, 0, 1, 1]);
- printl(" 标清结果: " + (result0 != null ? "找到" : "未找到"));
-
- printl("质量1(高清):速度中等,适合一般场景");
- var result1 = opencv.findImages(targetImages, 0.7, 3000, 1, [0, 0, 1, 1]);
- printl(" 高清结果: " + (result1 != null ? "找到" : "未找到"));
-
- printl("质量2(超清):速度慢,适合精细查找");
- var result2 = opencv.findImages(targetImages, 0.7, 3000, 2, [0, 0, 1, 1]);
- printl(" 超清结果: " + (result2 != null ? "找到" : "未找到"));
-
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法九:templateMatch - 指定区域的模板匹配
- function example9_templateMatch_region() {
- printl("【示例9】templateMatch - 指定区域的模板匹配");
- printl("适用场景:在屏幕的特定区域内进行模板匹配");
- try {
- var image = screen.screenShotFull();
- var mat = image.getMat();
-
- var templates = ['图色769598.cv'];
- var region = [0.3, 0.3, 0.7, 0.7];
-
- printl("在区域 [" + region.join(", ") + "] 内进行模板匹配");
- printl("说明:只在屏幕中央区域查找,提高效率");
-
- var matchResults = opencv.templateMatch(mat, templates, 0.8, region, false);
-
- if (matchResults != null && matchResults.length > 0) {
- printl("在指定区域内找到 " + matchResults.length + " 个目标");
- matchResults[0].clickRandom();
- } else {
- printl("指定区域内未找到目标");
- }
-
- mat.close();
- image.close();
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法十:findImages - 不同相似度阈值的找图
- function example10_findImages_threshold() {
- printl("【示例10】findImages - 不同相似度阈值的找图");
- printl("适用场景:根据需求调整相似度阈值,平衡精确度和召回率");
- try {
- var targetImages = ['图色769598.cv'];
-
- printl("测试不同相似度阈值:");
- printl("阈值0.5(宽松):容易找到,但可能误匹配");
- var result05 = opencv.findImages(targetImages, 0.5, 3000, 1, [0, 0, 1, 1]);
- printl(" 阈值0.5结果: " + (result05 != null ? result05.length + "个" : "未找到"));
-
- printl("阈值0.7(中等):平衡精确度和召回率");
- var result07 = opencv.findImages(targetImages, 0.7, 3000, 1, [0, 0, 1, 1]);
- printl(" 阈值0.7结果: " + (result07 != null ? result07.length + "个" : "未找到"));
-
- printl("阈值0.9(严格):只匹配非常相似的目标");
- var result09 = opencv.findImages(targetImages, 0.9, 3000, 1, [0, 0, 1, 1]);
- printl(" 阈值0.9结果: " + (result09 != null ? result09.length + "个" : "未找到"));
-
- } catch (e) {
- printl("错误: " + e);
- }
- printl("");
- }
- // 方法十一:综合自动化流程 - 完整的自动化操作流程(实战案例)
- function example11_comprehensive_flow() {
- printl("【示例11】综合自动化流程 - 实战案例");
- printl("适用场景:完整的自动化操作流程,模拟实际应用");
- try {
- printl("========== 步骤1: 使用findImagesEx查找第一个目标 ==========");
- var detects1 = opencv.findImagesEx('图色769598.cv');
- if (detects1 != null && detects1.length > 0) {
- printl("✓ 找到目标1,点击");
- printl(" 位置: x=" + detects1[0].x + ", y=" + detects1[0].y);
- detects1[0].clickRandom();
- sleep(2000);
-
- printl("\n========== 步骤2: 使用findImages查找多个目标 ==========");
- var targetImages = ['图色769598.cv', '图色769599.cv'];
- printl("查找图片列表: " + targetImages.join(", "));
- var multiResults = opencv.findImages(targetImages, 0.7, 3000, 1, [0, 0, 1, 1]);
-
- if (multiResults != null) {
- printl("✓ 找到 " + multiResults.length + " 个目标");
- if (multiResults.length > 0) {
- printl("✓ 点击第一个目标");
- multiResults[0].clickRandom();
- sleep(2000);
- }
-
- printl("\n========== 步骤3: 使用templateMatch在指定区域查找 ==========");
- var image = screen.screenShotFull();
- var mat = image.getMat();
- var templates = ['图色769598.cv'];
- var region = [0.3, 0.3, 0.7, 0.7];
-
- printl("在区域 [" + region.join(", ") + "] 内查找");
- printl("说明:只在屏幕中央区域查找,提高效率");
- var matchResults = opencv.templateMatch(mat, templates, 0.8, region, true);
-
- if (matchResults != null && matchResults.length > 0) {
- printl("✓ 在指定区域内找到目标");
- printl(" 位置: x=" + matchResults[0].x + ", y=" + matchResults[0].y);
- matchResults[0].clickRandom();
- } else {
- printl("✗ 指定区域内未找到目标");
- }
-
- mat.close();
- image.close();
-
- printl("\n========== 步骤4: 查找所有相同目标并批量点击 ==========");
- var allDetects = opencv.findImagesEx('图色769598.cv');
- if (allDetects != null && allDetects.length > 0) {
- printl("✓ 找到 " + allDetects.length + " 个相同目标");
- printl("开始批量点击...");
- for (var i = 0; i < allDetects.length; i++) {
- printl(" 点击目标 " + (i + 1) + "/" + allDetects.length);
- allDetects[i].clickRandom();
- sleep(300);
- }
- printl("✓ 批量点击完成");
- } else {
- printl("✗ 未找到目标");
- }
- } else {
- printl("✗ 多图查找失败");
- }
- } else {
- printl("✗ 未找到目标1");
- }
-
- printl("\n========== 综合流程执行完成 ==========");
- } catch (e) {
- printl("综合流程错误: " + e);
- }
- printl("");
- }
- // ========== 实用辅助函数集合 ==========
- // 辅助函数1:安全找图(带重试机制)
- function safeFindImage(cvFile, maxRetries) {
- printl("【辅助函数】safeFindImage - 安全找图(带重试机制)");
- for (var retry = 0; retry < maxRetries; retry++) {
- try {
- printl("查找图片: " + cvFile + " (尝试 " + (retry + 1) + "/" + maxRetries + ")");
- var detects = opencv.findImagesEx(cvFile);
-
- if (detects != null && detects.length > 0) {
- printl("✓ 找到目标");
- return detects;
- }
-
- if (retry < maxRetries - 1) {
- printl("未找到,等待重试...");
- sleep(1000);
- }
- } catch (error) {
- printl("查找出错: " + error);
- if (retry < maxRetries - 1) {
- sleep(2000);
- }
- }
- }
- printl("✗ 未找到图片: " + cvFile);
- return null;
- }
- // 辅助函数2:批量点击所有匹配目标
- function clickAllTargets(detects) {
- printl("【辅助函数】clickAllTargets - 批量点击所有匹配目标");
- if (detects == null || detects.length === 0) {
- printl("没有可点击的目标");
- return;
- }
-
- printl("准备点击 " + detects.length + " 个目标");
- for (var i = 0; i < detects.length; i++) {
- printl("点击目标 " + (i + 1) + ": x=" + detects[i].x + ", y=" + detects[i].y);
- detects[i].clickRandom();
- sleep(300);
- }
- printl("✓ 所有目标点击完成");
- }
- // 辅助函数3:获取目标中心点
- function getTargetCenter(detect) {
- printl("【辅助函数】getTargetCenter - 获取目标中心点");
- if (detect == null) {
- return null;
- }
- var center = {
- x: detect.x + detect.width / 2,
- y: detect.y + detect.height / 2
- };
- printl("目标中心点: x=" + center.x + ", y=" + center.y);
- return center;
- }
- // 辅助函数4:判断目标是否在指定区域内
- function isTargetInRegion(detect, region) {
- printl("【辅助函数】isTargetInRegion - 判断目标是否在指定区域内");
- if (detect == null) {
- return false;
- }
- var centerX = detect.x + detect.width / 2;
- var centerY = detect.y + detect.height / 2;
- var inRegion = centerX >= region[0] && centerX <= region[2] &&
- centerY >= region[1] && centerY <= region[3];
- printl("目标中心点(" + centerX + ", " + centerY + ") " +
- (inRegion ? "在" : "不在") + "区域内");
- return inRegion;
- }
- // 辅助函数5:查找并点击最接近指定坐标的目标
- function findAndClickNearestTarget(cvFile, targetX, targetY) {
- printl("【辅助函数】findAndClickNearestTarget - 查找并点击最接近指定坐标的目标");
- try {
- var detects = opencv.findImagesEx(cvFile);
- if (detects == null || detects.length === 0) {
- printl("未找到目标");
- return false;
- }
-
- var nearestIndex = 0;
- var minDistance = Number.MAX_VALUE;
-
- for (var i = 0; i < detects.length; i++) {
- var centerX = detects[i].x + detects[i].width / 2;
- var centerY = detects[i].y + detects[i].height / 2;
- var distance = Math.sqrt(Math.pow(centerX - targetX, 2) + Math.pow(centerY - targetY, 2));
-
- if (distance < minDistance) {
- minDistance = distance;
- nearestIndex = i;
- }
- }
-
- printl("找到最近的目标,距离: " + minDistance.toFixed(2));
- detects[nearestIndex].clickRandom();
- return true;
- } catch (e) {
- printl("错误: " + e);
- return false;
- }
- }
- // 辅助函数6:查找并点击最相似的目标
- function findAndClickBestMatch(cvFile, threshold) {
- printl("【辅助函数】findAndClickBestMatch - 查找并点击最相似的目标");
- try {
- var detects = opencv.findImagesEx(cvFile);
- if (detects == null || detects.length === 0) {
- printl("未找到目标");
- return false;
- }
-
- printl("找到 " + detects.length + " 个目标");
- printl("点击第一个目标(通常是最相似的)");
- detects[0].clickRandom();
- return true;
- } catch (e) {
- printl("错误: " + e);
- return false;
- }
- }
- // 辅助函数7:等待目标出现并点击
- function waitForTargetAndClick(cvFile, maxWaitTime) {
- printl("【辅助函数】waitForTargetAndClick - 等待目标出现并点击");
- printl("最大等待时间: " + maxWaitTime + "毫秒");
-
- var startTime = Date.now();
- while (Date.now() - startTime < maxWaitTime) {
- try {
- var detects = opencv.findImagesEx(cvFile);
- if (detects != null && detects.length > 0) {
- printl("✓ 目标已出现,点击");
- detects[0].clickRandom();
- return true;
- }
- sleep(500);
- } catch (e) {
- printl("查找出错: " + e);
- }
- }
-
- printl("✗ 超时,目标未出现");
- return false;
- }
- // ========== 方法使用建议 ==========
- function printUsageTips() {
- printl("========== 找图方法使用建议 ==========");
- printl("");
- printl("1. 方法选择建议:");
- printl(" - 单图找图 → opencv.findImagesEx(最简单直接)");
- printl(" - 多图查找 → opencv.findImages(支持超时和质量设置)");
- printl(" - 自定义匹配 → opencv.templateMatch(最灵活)");
- printl("");
- printl("2. 性能优化建议:");
- printl(" - 提高相似度阈值(如0.8-0.9)可减少误匹配");
- printl(" - 使用区域参数限定查找范围可提高速度");
- printl(" - 设置合理的超时时间避免长时间等待");
- printl(" - 根据需求选择合适的截图质量(0/1/2)");
- printl("");
- printl("3. 资源管理建议:");
- printl(" - 使用templateMatch时记得调用mat.close()和image.close()");
- printl(" - 避免在循环中频繁截图,可使用OCR.lockOCR()锁定缓存");
- printl("");
- printl("4. 实战技巧:");
- printl(" - 使用safeFindImage()实现带重试的找图");
- printl(" - 使用clickAllTargets()批量点击所有目标");
- printl(" - 使用waitForTargetAndClick()等待目标出现");
- printl(" - 使用findAndClickNearestTarget()点击最近的目标");
- printl("");
- printl("========== 使用建议结束 ==========");
- }
- // 运行主函数
- main();
- // 打印使用建议
- printUsageTips();
复制代码
| |  | |  |
|