系统要求

  • 图色检索 Android 系统必须 >= 5.0 才支持

# 多点找色

多点找色,可以按照 图色助手 生成的规则,找出屏幕上符合特征点的坐标

# findColor() 返回单坐标

视频教程 (opens new window)通过 图色助手 生成的特征点 找到 屏幕上 符合条件的 1个特征点

参数

  • 参数1 必填 | table类型 : 参数集合如:例如{0,0,100,200,"0,10,#FFFFF|98,12,#FFFAA",95,2};
    • 前4位 :找色范围
    • 第5位 :屏幕颜色特征,x坐标,y坐标,#RGB颜色 ,多个颜色用'|' 隔开
    • 第6位 :找色精度 【0-100】,100为完全匹配。建议:95 。【非必填】 默认 95
    • 第7位 :找色方向 1 - 8 【非必填】 默认 2
-- 案例: 
    color = {64,275,110,322,"87,295,#FCF19B|74,296,#D98421|100,296,#D5912C|101,297,#CF8B29|86,311,#E9C135",95}; 
    p  = findColor(color); 
    if p then 
        print('点击了')
        click(p.x,p.y);  -- 坐标点击方法 需 Android 7.0 以上系统支持 (包含7.0)
    end
1
2
3
4
5
6
7

# findColors() 返回返多个坐标

视频教程 (opens new window)通过 图色助手 生成的特征点 找到 屏幕上 符合条件的 多个特征点

参数

  • 参数1 必填 | table类型 : 参数集合如:例如{0,0,100,200,"0,10,#FFFFF|98,12,#FFFAA",95,2};
    • 前4位 :找色范围
    • 第5位 :屏幕颜色特征,x坐标,y坐标,#RGB颜色 ,多个颜色用'|' 隔开
    • 第6位 :找色精度 【0-100】,100为完全匹配。建议:95 。【非必填】 默认 95
    • 第7位 :找色方向 1 - 8 【非必填】 默认 2
-- 案例: 
    color = {64,275,110,322,"87,295,#FCF19B|74,296,#D98421|100,296,#D5912C|101,297,#CF8B29|86,311,#E9C135",95}; 
    points  = findColors(color); 
    if points then 
        print("共找到:"..#points)
        for k,v in pairs(points) do 
            print("X:"..v.x..",Y"..v.y);
        end
    else 
        print('没有找到颜色')
    end
1
2
3
4
5
6
7
8
9
10
11

# 找色方向

findColors 或 findColor 的第7位参数

  • 第7位 :找色方向 1 - 8 【非必填】 默认 2
  • orient = 1,左上角到右下角,纵向开始找色,先找到 a 顶点。

  • orient = 2,左上角到右下角,横向开始找色,先找到 b 顶点。

  • orient = 3,右上角到左下角,横向开始找色,先找到 c 顶点。

  • 以此类推。


# 颜色函数

# getColor() 获取RGB颜色

可通过坐标获取 屏幕 某点的RGB颜色值

参数

c = getColor(1064,1195);
if c then 
    print(c.hex) -- 16进制RGB色值
    print(c.r) -- red 色值
    print(c.g) -- green 色值
    print(c.b) -- blue 色值
end
1
2
3
4
5
6
7

# compareColor() 坐标与颜色比较

比对 屏幕上的坐标RGB,是否与预期的RGB 颜色相同

参数

--案例:
cReult = compareColor( 650, 1171, "#20C4FF", 95 );
if cReult then
	print( '颜色匹配' )
else
	print( '颜色不匹配' )
end
1
2
3
4
5
6
7

# compareColor() RGB颜色比较

比对 两个RGB颜色 是否相同

参数

cReult = compareColor("#21C4FF", "#20C4FF", 95 );
if cReult then
	print( '颜色匹配' )
else
	print( '颜色不匹配' )
end
1
2
3
4
5
6

# 文字识别

# ocrp() 卷积神经网络文字识别

视频教程 (opens new window)该识别精度非常高 推荐使用该识别方式,实现全分辨率脚本编写

参数

-- 案例:
r = {
    -- match = ""; --要匹配的数据,支持正则过滤
    -- sim = 0.9;--最低准确度(0-1) 不要写1,给予神经网络的识别不会有1哦
    -- rect = {194,852,650,1092}; --屏幕上的范围(一般建议不要选择范围,有利于全分辨率适配)
}
 
local res = ocrp(r); 
-- res 是一个table 识别到的每一个词都会分成一段
for k,v in pairs(res) do 
    print(v.text) -- 识别到的文本
    print(v.confidence) -- 文本的精确度,该精度是深度学习后返回的数值(无限接近于1)
    print(v.text_box_position) -- 识别区域的顶点坐标(非全是矩形区域,旋转的文字也可识别)
    v:click(); -- 可以通过click 方法直接进行点击
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# ocr() 本地文字识别

该文字识别,识别速度快。但精度低

参数

-- ocr 的参数 为 屏幕中的范围 可用图色助手扩选
a,b = ocr(360,656,541,941);
if(a) then
    print(a);
    print(JsonEncode(b))
end

-- a 为识别到的文字
-- b 为识别的具体属性(table类型),里面包含每个字的坐标。
1
2
3
4
5
6
7
8
9

# 深度学习

# 目标检测

通过目标检测,我们可以加载不同模型,快速检测出各种场景中目标所在的位置

# 模型加载

我们在代码中可以加载不同的模型

参数

  • 参数1 必填 | string类型 : 模型名称与版本,模型名称与版本之间冒号连接
    • 例如 "第一个模型:v1.7"
-- ocr 的参数 为 屏幕中的范围 可用图色助手扩选
cnnLoad('第一个模型:v1.7');
1
2

# 目标检测

我们可以通过该方法,识别出屏幕中的目标来

参数

  • 参数1 选填 | table类型 : 检测选填参数
    • size:(number)引擎中识别的图像尺寸,默认为640
    • draw:(boolean)是否开启绘制模式,开启后识别结果将直接绘制在屏幕上
-- ocr 的参数 为 屏幕中的范围 可用图色助手扩选
cnnLoad("第一个模型:v1.7")
while true do
    local params = {
      draw=true, --把识别结果绘制在屏幕上
      size=640,--引擎中识别图片的大小,默认640,尺寸过大会影响识别速度
    };
    local res = cnnFind(params);
    for k,v in  pairs(res) do
        print(v.x) -- 目标的左上角x坐标
        print(v.y) -- 目标的左上角y坐标
        print(v.w) -- 目标的宽度
        print(v.h) -- 目标的高度
        print(v.prob) -- 目标的识别度
        print(v.label) -- 目标标签
    end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 模型训练

    1. 打标签集

我们只需打开节点开发工具,在工具栏中,点开“深度学习目标检测” 将对应的目标框选后给予一个标签即可

    1. 导出标签集

在标签工具右上角,有导出模型 ,我们导出cnp文件即可

    1. 上传标签开始训练模型

拿到cnp文件后,我们需要将文件上传至开发者后台,进行训练,一般为30分钟-60分钟,即可训练完毕。

训练完毕后,就可以在小程序中 使用 cnnLoad('您的模型名称:版本') 加载使用了!


# 图像识别

# imgAna 图像处理

图像处理视频教程 (opens new window)

可对图像进行二值化,灰度,取色二值,替色,膨胀,腐蚀,开闭运算,边缘等计算处理

该函数整体参数较为复杂,因此请使用工具来生成相应代码

该函数需要配合图像处理工具来使用,需节点版本大与3318以上

# 灰度图

"[{'type':'灰度'}]"

将图片处理为0-255亮度的 单通道灰白图片

0为黑色, 255为白色

0-255 之间为不同亮度的灰色

# 二值化

"[{'type':'二值','fz':150}]"

将图片根据阈值处理为黑白图片

什么是阈值?灰度图 可将图片转换为0-255的单通道图片,黑色为0,白色为255,灰度在(0-255)之间,我们假如给定了一个阈值120,那么灰度小于120都将重置为0(黑色),灰度大于120的将置为白色,由此可以得到一张二值图片。

# 取色

将选中的颜色保留 为白色,其余颜色重置为黑色 得到一张二值化图片

# 替色

将选中的颜色 替换为 目标颜色

#

# findShape() 图形识别

视频教程 (opens new window) 通过图形识别算法(该特征点支持全分辨率) 通过该方法,无论设备的 屏幕像素(px) 或者屏幕密度(dpi) 怎么变,我们都可以轻松得到图形在屏幕中的位置

参数

参数过于复杂必须用工具生成,详情看视频教程

    -- 图形识别 生成的特征
local r = {'#00A0EA-95','[{"a":-0.746,"d":1.006,"id":"1","r":5119.0,"s":"91|2gLO?bJZT68&3NkfGX77sAm$&t45Ku4UXb9LO&1CgmtGi?2JFi8&5~{bEc`Oaqt9!&b?Qn2p<mkQYla&LQRe9pXb4T9Ly&1hrssiPEm9wjAI&2ySUUBp2Ii}D4$&4(vzy~O5aBP0e)&4(vzy~H4n~1tx*&9Y!*(I^2E1Smn6&jHL@Xafy6<I956&jHL@EjLOOKSqly&D9hN2DhnmN)Tok&10izi~SMb0aQqo0&10izgW6`h[AFQ)U&20A*oNVo@8u3bJi&20A*6>[7D?oBd^q&20A(NF5O?FdNqos&20A)UTFJSHleF~c&40<Xzxt}HkW6pfo&40<T}efd8JVDcrs&40<y2R3x!}I*{0G&40<y2Wydz@jb?$2&40<y3c!LtPs4so!&40>o(DdsxkJUjSK&81)9^mUl7yq*E<N&81[N@g~tXQ`G{]N&81[N]OdRJ$jmMX5&81@Pz5wL8ce9wdN&81@PH?]gWWUi?c`&81@PZMWy3<Z!)W]&81VS~Bi5HAXHKOP&81VTv)`xo)9gpP{&81JZVJ(!$8Hc3hR&81J!Ovs9tziyxs]&81J!Ove`}k`8vZZ&81J!Ou[QUgg`Fcb&81J!Oue6E0YHBjV&81J}A1l[(F{jzk]&81l^9xhf0*{}tJ(&81l^9v)0KP]k]3p&81l^9v)0KP]k]3p&81l^9v)0KP]k]3p&81l^9v)0KP]k]3p&81l^9v)0KP]k]3p&81l^9v)0KP]k]3p&81l^9v)0KP]k]3p&81l^9xhf0*{}tJ(&81J}A1l[(Btd<On&81J}A1l[(Hpoh<d&81J!Ou[QUgh1<Ez&81J!Ove`}w]xvwr&81J!Ove`}w]xvwr&81JZVJ@ifKsVcab&81VTv)`xo)9pcuz&81VS~Bhz8DmXIJN&81VS~Bil6nPCRmn&81@PH?]gWWUjy*X&81@Pz5wL8ce9AgT&81[N]OdRJ$jmMX5&81[N@g~tXQ`G{]N&81)9^mUl7yq*E<N&40>o(DdsxkJUjSK&40<4^7gho>K*}uG&40<y2Wydz@jb?$2&40<MHZisCc)Tqhw&40<MHP!5KvGTj$2&40<T}dEI*iu}FeS&40<Xzx6@@pBFmd*&20A)UTEXUW*mdb!&20A(NF5O?FdRX0>&20A*6>[7D?oBd^q&10izco]PvHfSLeo&10izgW6`h[Byu5W&D9hMBro5DaYwo0&jHL@EjLOOKSqly&jHL@Ux}LJCwDoQ&9Y!*(iR>ntm}ve&4(vzyLE>uCEbpm&4(vzy~O5aBP0e)&2ySUUBp2Ii}D4$&1hrssiPEm9wjAI&n{qK4P)IFrHH2&b?Qn2p<mkQYla&2$wIX6B}5dcGs&1CgmtGi?2JFi8&t45Ku4UXb9LO&3NkfGX77sAm$&2gLO?bJZT68"}]',0.85}
-- 调用findShape方法
local 结果 =  findShape(r)
for k,v in pairs(结果) do 
    print(v.id); -- 图形id
    print(v.sim); -- 图形相似度
    print(v.scale); -- 图形的缩放倍数
    print(v.x); -- 图形重心 x坐标
    print(v.y); -- 图形重心 y坐标
end
1
2
3
4
5
6
7
8
9
10
11

# ocrx() 点阵识别

参数

  • 参数1 必填 | string类型 : 点阵字库文件
    • 1.创建好字库文件(名称后缀任意)
    • 2.利用点阵助手 生成点阵信息
    • 3.复制进入字库文件,一个特征一行。*多个特征记得断行
  • 参数2-5 必填 | number类型 :识别范围
  • 参数6 必填 | number类型 :相似度 100为100%匹配

参数过于复杂必须用工具生成,详情看视频教程

-- ocrx 的参数:
-- 参数1:点阵字库文件
-- 参数2-5:屏幕的范围
-- 参数6 :相似度 100为100%匹配
text,msgs =  ocrx("font.t",778,282,1016,464,95)
if text then
    print(text); -- 识别到的文字,会自动换行
    for k,v in pairs(msgs) do
        print(v.text); --文字
        print(v.x); --x坐标 (相对于屏幕)
        print(v.y); --y坐标 (相对于屏幕)
        print(v.sim);  -- 相似度(0-1) 1=100%匹配
        print(v.width); -- 宽度 (字符的宽度)
        print(v.height); -- 高度(字符的高度)
    end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# qrDecode() 解析二维码

可以通过该方法, 解析一张二维码图片的内容
如果解析失败会返回nil

参数

qrDecode(图片路径);

    local str = getDirSD().."Download/123456.png"
    local 识别结果 = qrDecode(str);
    print(识别结果)
1
2
3

# 代答验证

# 速安

该部分用 插件集成

# 联众

该部分用 插件集成

# 截图

可对设备进行图色操作


# capture() 全屏截图

快速将手机屏幕截图

参数

  • 参数1 必填 | string类型 : 截图后存储的文件路径
  • 参数2 选填 | number类型 : 截图存储的清晰度(0-100) 100为无损截图
    • 【默认为100】
  • 参数3 选填 | number类型 : 截图的最大边像素,会等比缩放图片
    • 【默认为设备分辨率】
-- 案例:
--1.将当前屏幕截图并保存 并命名为1.png
capture("/sdcard/DCIM/1.png") 

--2.将当前屏幕截图并保存 并命名为1.png ,清晰度为原图的30%
capture("/sdcard/DCIM/1.png",30)

--3.将当前屏幕截图并保存 并命名为1.png ,清晰度为原图的30%,并且图片最长边为500像素,短边按比例自动缩放
capture("/sdcard/DCIM/1.png",30,500)

1
2
3
4
5
6
7
8
9
10

# capture() 区域截图

语法 capture("path",left,top,right,bottom,q)

将设备屏幕 区域截图 后保存

参数

--案例:
--1.将当前屏幕[0,0,300,400]区域 截图并保存 并命名为1.png
capture("/sdcard/DCIM/1.png",0,0,300,400)

--2.将当前屏幕[0,0,300,400]区域 截图并保存 并命名为1.png ,清晰度为原图的80%
capture("/sdcard/DCIM/1.png",0,0,300,400,80)

--3.将当前屏幕[0,0,300,400]区域 截图并保存 并命名为1.png ,清晰度为原图的80%,并且图片最长边为500像素,短边按比例自动缩放
capture("/sdcard/DCIM/1.png",0,0,300,400,80,500)
1
2
3
4
5
6
7
8
9

# capture2Gallery()截图至系统相册

可以通过该方法截图,并保存在系统相册(该方法会通知系统更新相册,其他应用可从相册中选择保存的图片)


cons(false); --关闭悬浮窗,防止悬浮窗被截图
sleep(500);--系统 等待500毫秒,等待悬浮窗关闭
local path = capture2Gallery(); --保存图片 至系统相册
print(path) -- path 为图片路径,如果有需要,可以通过路径删除该图片,以保证内存不满,删除方法可在插件里找对应方法
cons(true);-- 重新打开悬浮窗

1
2
3
4
5
6
7

# 图色缓存

# keepScreen() 缓存屏幕

视频教程 (opens new window) 函数可以缓存屏幕,开启此方法后,屏幕在内存中将不再刷新,部分场景下可通过此方法来增加找色,比色等效率

参数

  • 参数1 必填 | boolean类型 : 是否开启屏幕缓存
    • true :开启屏幕缓存,内存中的屏幕缓存将不再刷新
    • false:关闭屏幕缓存,恢复内存屏幕刷新
-- 开启 屏幕 缓存,并进行1000此找色 (这种场景下建议开启缓存),使用完成后请即时释放屏幕,否则后续图色可能失效
keepScreen(true);
for i=1,1000 do
    c = getColor(300,300);
    print(i..':'..c.hex);
end
keepScreen(false);
1
2
3
4
5
6
7