找图找色2(文档限制)

# $images.detectAndComputeFeatures(img[, options]) [v9.2新增] - img {Image} 图片,要计算特征的图片 - options {object} 特征计算选项,可选参数: 1. scale {number} 计算特征时图片的缩放比例,缩放比例越小,计算特征越快,但可能因为放缩过度导致特征计算错误。对于宽度 * 高度 > 1000000的图片,scale参数默认为0.5,否则scale默认为1 1. grayscale {boolean} 是否灰度化后再计算特征,默认为true 1. method {string} 图像特征匹配的方法,默认为SIFT,也可指定为ORB(不推荐) 1. region {Array} 图像的匹配区域,不填此字段时则为整个图片计算特征 - 返回 {ImageFeatures} 保存图片特征的对象,不用时需要调用recycle()回收 对给定图片计算特征,将图片计算后的特征信息返回。该特征信息对象可用于后续使用matchFeatures函数做特征匹配。 一般而言,小图的特征可以在程序开始时就计算,在程序结束时再回收。如果每次截图时都去读取小图、计算小图特征,不仅会导致程序运行效率低,而且会导致内存碎片,从而使得内存难以利用和更快耗尽。 # $images.matchFeatures(scene, object[, options]) [v9.2新增] - scene {ImageFeatures} 场景图片的特征对象(大图特征) - object {ImageFeatures} 目标图片的特征对象(小图特征) - options {object} 可选参数: 1. matcher {string} 特征匹配方式,默认为FLANNBASED,可选的值有"FLANNBASED", "BRUTEFORCE", "BRUTEFORCE_L1", "BRUTEFORCE_HAMMING", "BRUTEFORCE_HAMMINGLUT", "BRUTEFORCE_SL2",除了FLANNBASED外其他匹配方式未经过充分测试 1. drawMatches {string} 绘制图片匹配详情的路径,若为空则不绘制匹配详情。此选项一般为调试使用,在真正匹配时请勿指定,否则会增加耗时。 1. thredshold {number} 匹配阈值,默认为0.7 - 返回 {ObjectFrame} | {null} 小图在大图中的匹配位置,若未找到则返回null 特征匹配提供了全分辨率找图功能,可以识别检测图像中明显的特征并根据特征来查找类似图片。即使图片的分辨率、形状、旋转有差异也能识别出来,但匹配速度相对较慢。 需要注意的是,计算特征的过程也比较耗时,因此请勿在每次匹配时才计算小图的特征,小图若不变可以提前计算特征并复用特征对象。 以下是一个简单的示例,也在Auto.js Pro内置示例"图片与图色处理 - 找图找色"文件夹中,可直接运行。 ``` // 读取小图 let hellokitty = $images.read('./hellokitty.jpg'); // 计算小图特征 let objectFeatures = $images.detectAndComputeFeatures(hellokitty); // 请求截图权限 requestScreenCapture(); // 打开HelloKitty图片 $app.openUrl('https://baike.baidu.com/item/Hello%20Kitty/984270') let n = 3; for (let i = 0; i < n; i++) { sleep(3000); let capture = captureScreen(); // 若要提高效率,可以在计算大图特征时调整scale参数,默认为0.5, // 越小越快,但可以放缩过度导致匹配错误。若在特征匹配时无法搜索到正确结果,可以调整这里的参数,比如{scale: 1} // 也可以在这里指定{region: [...]}参数只计算这个区域的特征提高效率 let sceneFeatures = $images.detectAndComputeFeatures(capture); // 最后一次匹配时,我们将特征和匹配绘制出来,在调试时更容易看出匹配效果,但会增加耗时 let drawMatches = (i === n - 1 ? './matches.jpg' : undefined); let result = $images.matchFeatures(sceneFeatures, objectFeatures, { drawMatches }); // 打印结果和中心点,可使用click(reuslt.centerX, result.centerY)点击 console.log(result, result ? result.center : null); // 回收特征对象 sceneFeatures.recycle(); if (drawMatches) { // 可以在当前目录查看matches.jpg图片,会绘制详细匹配详情 app.viewFile('./matches.jpg'); } } // 回收小图特征对象 objectFeatures.recycle(); hellokitty.recycle(); ``` # ImageFeatures [v9.2新增] 存储特征信息的类,仅用于特征匹配。 ## ImageFeatures.recycle() 回收特征对象。必须显式在不使用该对象时调用,否则会导致内存泄露而程序崩溃。 # ObjectFrame [v9.2新增] 特征匹配返回的结果,表示一个四边形。 ## ObjectFrame.topLeft {Point} 四边形的左上角坐标。 ## ObjectFrame.topRight {Point} 四边形的右上角坐标。 ## ObjectFrame.bottomLeft {Point} 四边形的左下角坐标。 ## ObjectFrame.bottomRight {Point} 四边形的右下角坐标。 ## ObjectFrame.center {Point} 四边形的中心点坐标。 ## ObjectFrame.centerX {number} 四边形的中心点x坐标。 ## ObjectFrame.centerY {number} 四边形的中心点y坐标。 # MatchingResult **[v4.1.0新增]** ## 匹配结果 |matches | 方法名 | 返回值 | 备注 | | -------------- | -------- | ------------------------------------------------------ | | matches | | 返回图片image在点(x, y)处的像素的ARGB值。 | | **参数名** | **类型** | | | 匹配结果的数组 | 数组 | `point` {Point} 匹配位置、`similarity` {number} 相似度 | matches * {Array} 匹配结果的数组。 数组的元素是一个Match对象: * `point` {Point} 匹配位置 * `similarity` {number} 相似度 例如: ```javascript var result = images.matchTemplate(img, template, { max: 100 }); result.matches.forEach(match => { log("point = " + match.point + ", similarity = " + match.similarity); }); ``` ## 匹配位置 |points | 方法名 | 返回值 | 备注 | | -------------- | -------- | -------------- | | points | | 匹配位置的数组 | | **参数名** | **类型** | | | 匹配位置的数组 | 数组 | | points * {Array} 匹配位置的数组。 ## 第一个匹配结果 |first | 方法名 | 返回值 | 备注 | | ------- | ------ | ------------------------------------------------ | | first() | Match | 第一个匹配结果。如果没有任何匹配,则返回`null`。 | first() * 返回 {Match} 第一个匹配结果。如果没有任何匹配,则返回`null`。 ## 最后一个匹配结果 |last | 方法名 | 返回值 | 备注 | | ------ | ------ | -------------------------------------------------- | | last() | Match | 最后一个匹配结果。如果没有任何匹配,则返回`null`。 | last() * 返回 {Match} 最后一个匹配结果。如果没有任何匹配,则返回`null`。 ## 最左边的匹配结果 |leftmost | 方法名 | 返回值 | 备注 | | ---------- | ------ | ------------------------------------------------------------ | | leftmost() | Match | 位于大图片最左边的匹配结果。如果没有任何匹配,则返回`null`。 | leftmost() * 返回 {Match} 位于大图片最左边的匹配结果。如果没有任何匹配,则返回`null`。 ## 最上边的匹配结果 |topmost | 方法名 | 返回值 | 备注 | | --------- | ------ | ------------------------------------------------------------ | | topmost() | Match | 位于大图片最上边的匹配结果。如果没有任何匹配,则返回`null`。 | topmost() * 返回 {Match} 位于大图片最上边的匹配结果。如果没有任何匹配,则返回`null`。 ## 最右边的匹配结果 |rightmost | 方法名 | 返回值 | 备注 | | ----------- | ------ | ------------------------------------------------------------ | | rightmost() | Match | 位于大图片最右边的匹配结果。如果没有任何匹配,则返回`null`。 | rightmost() * 返回 {Match} 位于大图片最右边的匹配结果。如果没有任何匹配,则返回`null`。 ## 最下边的匹配结果 |bottommost | 方法名 | 返回值 | 备注 | | ------------ | ------ | ------------------------------------------------------------ | | bottommost() | Match | 位于大图片最下边的匹配结果。如果没有任何匹配,则返回`null`。 | bottommost() * 返回 {Match} 位于大图片最下边的匹配结果。如果没有任何匹配,则返回`null`。 ## 相似度最高的匹配结果 |best | 方法名 | 返回值 | 备注 | | ------ | ------ | ------------------------------------------------------ | | best() | Match | 相似度最高的匹配结果。如果没有任何匹配,则返回`null`。 | best() * 返回 {Match} 相似度最高的匹配结果。如果没有任何匹配,则返回`null`。 ## 相似度最低的匹配结果 |worst | 方法名 | 返回值 | 备注 | | ------- | ------ | ------------------------------------------------------ | | worst() | Match | 相似度最低的匹配结果。如果没有任何匹配,则返回`null`。 | worst() * 返回 {Match} 相似度最低的匹配结果。如果没有任何匹配,则返回`null`。 ## 对匹配结果进行排序 |sortBy | 方法名 | 返回值 | 备注 | | ---------- | --------------- | ------------------------------------------------------------ | | sortBy() | Match | 对匹配结果进行排序,并返回排序后的结果。 | | **参数名** | **类型** | | | 比较函数 | Function/string | 比较函数,或者是一个字符串表示排序方向。例如\"left\"表示将匹配结果按匹配位置从左往右排序、\"top\"表示将匹配结果按匹配位置从上往下排序,\"left-top\"表示将匹配结果按匹配位置从左往右、从上往下排序。方向包括left(左), top (上), right (右), bottom(下)。 | sortBy(cmp) * cmp {Function}|{string} 比较函数,或者是一个字符串表示排序方向。例如"left"表示将匹配结果按匹配位置从左往右排序、"top"表示将匹配结果按匹配位置从上往下排序,"left-top"表示将匹配结果按匹配位置从左往右、从上往下排序。方向包括`left`(左), `top` (上), `right` (右), `bottom`(下)。 * {MatchingResult} 对匹配结果进行排序,并返回排序后的结果。 ```javascript var result = images.matchTemplate(img, template, { max: 100 }); log(result.sortBy("top-right")); ``` # Image 表示一张图片,可以是截图的图片,或者本地读取的图片,或者从网络获取的图片。 ## 取图片宽度 | getWidth | 方法名 | 返回值 | 备注 | | ---------------- | ------ | -------------------------- | | Image.getWidth() | 整数型 | 返回以像素为单位图片宽度。 | Image.getWidth() 返回以像素为单位图片宽度。 ## 取图片高度 | getHeight | 方法名 | 返回值 | 备注 | | ----------------- | ------ | ---------------------------- | | Image.getHeight() | 整数型 | 返回以像素为单位的图片高度。 | Image.getHeight() 返回以像素为单位的图片高度。 ## 图片保存 | saveTo | 方法名 | 返回值 | 备注 | | -------------- | -------- | -------------------------------------------- | | Image.saveTo() | | 把图片保存到路径path。(如果文件存在则覆盖) | | **参数名** | **类型** | | | 路径 | 字符串 | 图片保存路径 | Image.saveTo(path) * `path` {string} 路径 把图片保存到路径path。(如果文件存在则覆盖) ## 取图片某点像素 | pixel | 方法名 | 返回值 | 备注 | | ------------- | -------- | ----------------------------------------- | | Image.pixel() | 字符串 | 返回图片image在点(x, y)处的像素的ARGB值。 | | **参数名** | **类型** | | | 横坐标 | 整数型 | | | 纵坐标 | 整数型 | | Image.pixel(x, y) * `x` {number} 横坐标 * `y` {number} 纵坐标 返回图片image在点(x, y)处的像素的ARGB值。 该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。 坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。 ## # Point findColor, findImage返回的对象。表示一个点(坐标)。 ## 横坐标 | Point.x | 方法名 | 返回值 | 备注 | | ------- | ------ | ------ | | Point.x | 整数型 | 横坐标 | Point.x 横坐标。 ## 纵坐标 | Point.y | 方法名 | 返回值 | 备注 | | ------- | ------ | ------ | | Point.y | 整数型 | 纵坐标 | Point.y 纵坐标。 # ColorMapping 通过颜色映射的实现一种找色方式,对于同一张图找多次色,每次找色相比images模块里的函数非常快,只是需要相比一般找色需要一个初始化过程。 注意!ColorMapping仅能使用**截图的图片对象**初始化颜色映射。 初始化方式: ```javascript // 申请截图权限 $images.requestScreenCapture(); // 初始化ColorMapping let ColorMapping = $colors.mapping; // 创建ColorMapping实例 let cm = new ColorMapping(); // 截屏 let img = $images.captureScreen(); // 初始化颜色映射 cm.reset(img); // 使用完后及时回收 cm.recycle(); ``` 如果不想手动回收,可以用ColorMapping的单例,这个单例会自动在脚本结束时回收。 ```javascript // 申请截图权限 $images.requestScreenCapture(); // 初始化ColorMapping let ColorMapping = $colors.mapping; // 创建ColorMapping实例 let cm = ColorMapping.singleton; // 截屏 let img = $images.captureScreen(); // 初始化颜色映射 cm.reset(img); // 找色 cm.findColor("#ffffff") ``` ## ColorMapping.singleton * `ColorMapping` ColorMapping的全局单例对象。 ## ColorMapping.reset(img) * `img` {Image} 截图 此操作会重新初始化颜色映射的数据。 ## ColorMapping.recycle() 此操作会释放ColorMapping对象。 ## ColorMapping.findColor(color[, options]) * `color` {number} | {string} 要检测的颜色 * `options` {Object} 选项包括: * `region` {Array} 找色区域。是一个两个或四个元素的数组。(region[0], region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0], region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。 * `similarity` {number} 找色时颜色相似度,范围为0~1(越大越相似,1为颜色相等,0为任何颜色都能匹配)。 * `threshold` {number} 找色时颜色相似度的临界值,范围为0 ~ 255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255 - threshold) / 255 。相似度与阈值二选一,同时存在则以相似度为准。 * 返回 {Point} 在图片中寻找颜色color。找到时返回找到的点Point,找不到时返回null。 一个同一张图多次找色的例子如下: ```javascript // 申请截图权限 $images.requestScreenCapture(); // 初始化ColorMapping let ColorMapping = $colors.mapping; // 创建ColorMapping实例 let cm = new ColorMapping(); // 使用ColorMapping找色 while (true) { // 截屏 let img = $images.captureScreen(); // 初始化颜色映射 cm.reset(img); let p1 = cm.findColor("#ffffff"); if (p1) { // ... console.log("白色点坐标" + p1); continue; } let p2 = cm.findColor("#000000"); if (p2) { // ... console.log("黑色点坐标" + p2); continue; } } // 释放ColorMapping cm.recycle(); ``` 一个区域找色的例子如下: ```javascript // 申请截图权限 $images.requestScreenCapture(); // 初始化ColorMapping let ColorMapping = $colors.mapping; // 创建ColorMapping实例 let cm = new ColorMapping(); // 截屏 let img = $images.captureScreen(); // 初始化颜色映射 cm.reset(img); // 使用ColorMapping找色,指定找色区域为在位置(400, 500)的宽为300长为200的区域,指定找色临界值为4 let point = cm.findColor("#00ff00", { region: [400, 500, 300, 200], threshold: 4 }); if(point){ toast("找到啦:" + point); }else{ toast("没找到"); } // 释放ColorMapping cm.recycle(); ``` ## ColorMapping.findMultiColors(firstColor, colors, options) * `firstColor` {number} | {string} 第一个点的颜色 * `colors` {Array} 表示剩下的点相对于第一个点的位置和颜色的数组,数组的每个元素为[x, y, color] * `options` {Object} 选项,包括: * `region` {Array} 找色区域。是一个两个或四个元素的数组。(region[0], region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0], region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。 * `threshold` {number} 找色时颜色相似度的临界值,范围为0 ~ 255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255 - threshold) / 255。 * 返回 {Point} 多点找色,与images.findMultiColors类似,但多次在同一张图片中找色速度极快。 一个同一张图片多次多点找色的例子: ```javascript // 申请截图权限 $images.requestScreenCapture(); // 初始化ColorMapping let ColorMapping = $colors.mapping; // 创建ColorMapping实例 let cm = new ColorMapping(); // 截屏 let img = $images.captureScreen(); // 初始化颜色映射 cm.reset(img); // 使用ColorMapping多点找色 let p1 = cm.findMultiColors("#ff00ff", [[10, 20, "#ffffff"], [30, 40, "#000000"]]); let p2 = cm.findMultiColors("#ff00ff", [[10, 20, "#ffffff"], [30, 40, "#000000"]]); log("p1" + p1 + "p2" + p2); // 释放ColorMapping cm.recycle(); ``` ## ColorMapping.findAllPointsForColor(color, options) * `color` {number} | {string} 要检测的颜色 * `options` {Object} 选项包括: * `region` {Array} 找色区域。是一个两个或四个元素的数组。(region[0], region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0], region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。 * `similarity` {number} 找色时颜色相似度,范围为0~1(越大越相似,1为颜色相等,0为任何颜色都能匹配)。 * `threshold` {number} 找色时颜色相似度的临界值,范围为0—255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255 - threshold) / 255 。相似度与阈值二选一,同时存在则以相似度为准。 * 返回 {Array} 在图片中寻找所有颜色为color的点。找到时返回找到的点Point的数组,找不到时返回null。 找出所有白色点和所有黑色点的例子: ```javascript // 申请截图权限 $images.requestScreenCapture(); // 初始化ColorMapping let ColorMapping = $colors.mapping; // 创建ColorMapping实例 let cm = new ColorMapping(); // 截屏 let img = $images.captureScreen(); // 初始化颜色映射 cm.reset(img); // 使用ColorMapping多点找色 let whitePoints = cm.findAllPointsForColor("#ffffff"); let blackPoints = cm.findAllPointsForColor("#000000"); if (whitePoints != null) { log("白色点有" + whitePoints.length + "个"); } else { log("未找到白色点"); } if (blackPoints != null) { log("黑色点有" + blackPoints.length + "个"); } else { log("未找到黑色点"); } // 释放ColorMapping cm.recycle(); ```