找图找色2
## $images.detectAndComputeFeatures(img[, options])
[v9.2新增]
- img {Image} 图片,要计算特征的图片
- options {object} 特征计算选项,可选参数:
1. scale {number} 计算特征时图片的缩放比例,缩放比例越小,计算特征越快,但可能因为放缩过度导致特征计算错误。对于宽度 \* 高度 > 1000000的图片,scale参数默认为0.5,否则scale默认为1
2. grayscale {boolean} 是否灰度化后再计算特征,默认为true
3. method {string} 图像特征匹配的方法,默认为SIFT,也可指定为ORB(不推荐)
4. 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外其他匹配方式未经过充分测试
2. drawMatches {string} 绘制图片匹配详情的路径,若为空则不绘制匹配详情。此选项一般为调试使用,在真正匹配时请勿指定,否则会增加耗时。
3. 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} 相似度
例如:
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}
对匹配结果进行排序,并返回排序后的结果。
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仅能使用**截图的图片对象**初始化颜色映射。
初始化方式:
// 申请截图权限 $images.requestScreenCapture(); // 初始化ColorMapping let ColorMapping = $colors.mapping; // 创建ColorMapping实例 let cm = new ColorMapping(); // 截屏 let img = $images.captureScreen(); // 初始化颜色映射 cm.reset(img); // 使用完后及时回收 cm.recycle();
如果不想手动回收,可以用ColorMapping的单例,这个单例会自动在脚本结束时回收。
// 申请截图权限 $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。
一个同一张图多次找色的例子如下:
// 申请截图权限 $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();
一个区域找色的例子如下:
// 申请截图权限 $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类似,但多次在同一张图片中找色速度极快。
一个同一张图片多次多点找色的例子:
// 申请截图权限 $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。
找出所有白色点和所有黑色点的例子:
// 申请截图权限 $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();