本期主题:介绍目前手机按键(按键精灵安卓版)在编写脚本中,都需要用到哪些方式进行图色识别。 惯例先讲好处: 1、找色,如何计算颜色相似度,解决不同款式手机中画面颜色差异的问题。 2、找图,不太推荐,我们来聊聊多点找色,解决找图缓慢不效率,判断不准确的问题。
科普小技巧:关于多点取色如何获取点阵特征(注意手机按键使用,多点找色取点不宜超过10个),请查看以下帖子 按键精灵(PC版):插件教学之《Color插件的多点找色原理介绍》 从零学起之安卓篇《如何简单获取手机画面导入PC按键抓抓》
正题一:找色,先介绍下手机按键自带的找色命令。
固定坐标获取单点颜色 注解:获取坐标X与Y位置的颜色值信息,返回存入变量col中。
- Dim col,x,y
- col=GetPixelColor(x,y)
- TracePrint "颜色=" & col
复制代码
区域范围查找单点颜色 注解:变量intX, intY需要预先定义。如果您还没有定义该变量,请取消下面一行的注释。 如果没有找到,intX和intY的值都会被置为-1,那么这里我们只需要判断一个值就可以确认是否找到。
代码语言:javascript复制Dim intX, intY
FindColor 0, 0, 720, 1280, "0000FF", 0, 0.9, intX, intY
//如果没有找到,intX和intY的值都会被置为-1,那么这里我们只需要判断一个值就可以确认是否找到。
If intX > 0 Then
//如果intX大于0,说明找颜色,IntX与IntY分别表示这颜色的位置坐标
TracePrint "找到颜色,坐标=" & intX & "," & intY
Else
//否则
TracePrint "没找到颜色"
End If
复制代码
要点讲解:如何判断两个颜色相似度,以便解决单点颜色判断上的误差问题,以下提供两个写好的函数模块给大家学习。
函数名称:IsCol 函数功能:通过计算16进制颜色值中的RGB平均差值,得出两个颜色值相似度是否到达对应百分比 函数参数: 参数1:字符串型,16进制颜色值 参数2:字符串型,16进制颜色值 参数3:整数型,相似度 返回值:True 或 False(符合或不符合) 函数范例:
代码语言:javascript复制'判断两个16进制值相似度是否到达对应百分比
Function IsCol(col1,col2,n)
IsCol=False
Dim r1,g1,b1
Dim r2,g2,b2
ColorToRGB col1,r1,g1,b1
ColorToRGB col2,r2,g2,b2
If 1 - (Abs(r1 - r2) Abs(g1 - g2) Abs(b1 - b2)) / 255 / 3 >= n Then IsCol=True
End Function
复制代码
函数名称:CmpCol 函数功能:获取固定坐标点16进制颜色值,传入IsCol函数进行相似度对比,得出两个颜色值相似度是否到达对应百分比 函数参数: 参数1:整数型,屏幕X坐标 参数2:整数型,屏幕Y坐标 参数3:字符串型,16进制颜色值 返回值:True 或 False(符合或不符合)
代码语言:javascript复制'固定坐标单点模糊找色
Function CmpCol(x,y,col,n)
CmpCol=False
If x < 0 or y < 0 Then Exit Function
Dim temp_col
temp_col=GetPixelColor(x,y)
If temp_col=col Then
CmpCol=True
Else
CmpCol=IsCol(col,temp_col,n)
End If
End Function
复制代码
1.5.1新增命令介绍
函数名称:CmpColor 函数功能:比较指定坐标点(x,y)的颜色,支持多色、偏色、相似度比较 函数参数: 参数1:整数型,屏幕X坐标 参数2:整数型,屏幕Y坐标 参数3:字符串型,16进制颜色值 参数4:整数型,颜色相似度(推荐0.9) 返回值:整数型,没找到返回-1,找到返回对应颜色序号,从0开始 调用范例:
代码语言:javascript复制Dim ret
ret = CmpColor(100,200,"FFFFFF|0000FF-000000|00FF00-101010",0.9)
If ret = -1 Then
TracePrint "颜色都不相等"
Else
TracePrint "匹配颜色的序号为:" & ret
End if
复制代码
批注: 如果(100,200)的颜色是FFFFFF,则返回0 如果(100,200)的颜色是0000FF,则返回1 如果(100,200)的颜色是00FF00或偏色在101010范围内,则返回2 以此类推
正题二:找图?不不,我是来推荐多点找色的,惯例先介绍下自带的找图命令。
区域范围查找图片 注解:变量intX, intY需要预先定义。如果您还没有定义该变量,请取消下面一行的注释。 如果没有找到,intX和intY的值都会被置为-1,那么这里我们只需要判断一个值就可以确认是否找到。 附件路径(Attachment:),由于各自手机文件路径各不相同,这里我还是推荐用附件路径吧,就下面例子这样。(提示:找图默认支持PNG格式,但也支持BMP格式)
1.5语法(增加偏色参数) | Dim intX, intYFindPic 0, 0, 0, 0, "Attachment:图片名称.png", "000000", 0, 0.9, intX, intYIf intX > 0 Then//如果intX大于0,说明找颜色,IntX与IntY分别表示这颜色的位置坐标TracePrint "找到图片,图片左上角点位置坐标:" & intX & "," & intYElse//否则TracePrint "找图失败"End If 复制代码 |
---|---|
1.3语法 | Dim intX, intYFindPic 0, 0, 0, 0, "Attachment:图片名称.png", 0, 0.9, intX, intYIf intX > 0 Then//如果intX大于0,说明找颜色,IntX与IntY分别表示这颜色的位置坐标TracePrint "找到图片,图片左上角点位置坐标:" & intX & "," & intYElse//否则TracePrint "找图失败"End If 复制代码 |
- Dim intX, intY
- FindPic 0, 0, 0, 0, "Attachment:图片名称.png", "000000", 0, 0.9, intX, intY
- If intX > 0 Then
- //如果intX大于0,说明找颜色,IntX与IntY分别表示这颜色的位置坐标
- TracePrint "找到图片,图片左上角点位置坐标:" & intX & "," & intY
- Else
- //否则
- TracePrint "找图失败"
- End If
复制代码 1.3语法
- Dim intX, intY
- FindPic 0, 0, 0, 0, "Attachment:图片名称.png", 0, 0.9, intX, intY
- If intX > 0 Then
- //如果intX大于0,说明找颜色,IntX与IntY分别表示这颜色的位置坐标
- TracePrint "找到图片,图片左上角点位置坐标:" & intX & "," & intY
- Else
- //否则
- TracePrint "找图失败"
- End If
复制代码
要点讲解:如何提高一个图像识别的效率与精确度。
首先想提高图像判断效率,那么我们得知道找图的原理方式,这样才能从中了解时间都耗到哪里去了,都做了什么,是否有什么方式可以减少时间,减少不必要的操作以达到节约时间又不影响图像判断结果。 简单分析: 1、确认找图都有什么步骤。 2、通过哪些步骤配合得到结果。 3、在不影响结果的情况下去除不必要的步骤以达到节约时间的目的,提高效率。
找图原理大致方式:(我这里以简单通俗的方式描述下找图原理,可能与真实原理有些出路,请大家无视) 第一步:全屏获取图色信息,获取整个屏幕所有像素点的颜色信息,临时保存。 第二步: 1、取要找的图片左上角第一个点颜色,进行范围查找单色,找到则临时记录那点坐标。 2、以该点为起点,对图片剩余部分全部像素点的颜色信息进行匹配判断,如果都相同,则说明这张图片找到,返回值起点坐标X与Y的值。 3、如果不是则继续循环扫描剩余部分,继续找符合第一点颜色的位置作为起点继续匹配,直到匹配正确或返回 -1,-1表示没有符合特征。 第三步:释放掉第一步临时保存的图色信息。(释放内存占用)
以上步骤了解,我们可以明确,时间都耗在整张图片全部点阵的匹配上了。 试想下,一张10*10的图片,每次找到起点,都必须进行100次的信息对比,如果在720*1280范围找图,再没找到匹配正确的图片时,前面疑似的部分每个起点都需要进行100次的信息对比,这样整体时间就消耗掉了。
那么:问大家一个简单的问题,判断一张图片是否存在的目的是什么,是否是判断图像中某个图像特征是否存在,比如某个图标?某个文字?某个符号?总的描述,就是几个颜色点,按照对应的形状排列起来的特征。 既然:找图的目的只是判断里面其中一小部分图色信息是否匹配,那么我们为何要把整张图片进行匹配呢? 结论:这里我们分析总结,我们其实只要确认一个范围内少部分颜色点的排列特征形状颜色是否匹配。
通俗点比喻:把找图找色比喻为去仓库取物。
单独执行找图 或 单独执行找色。 | 仓库取物。 |
---|---|
全屏截图保存内存中 | 打开仓库大门 |
对获取到的信息进行匹配,取出符合条件的信息。 | 进入仓库搜索制定物品搬出。 |
释放内存中临时储存信息。 | 关闭仓库大门。 |
总结:如果我需要对当前屏幕画面做一百次或更多次找图或取色,直接调用会导致每次执行取色匹配时对全屏图像进行临时储存,判断,再释放,再记录再释放,增加额外不必要的资源消耗,等于去仓库取100个物品,需要开关一百次大门,完全无意义,以下代码中用到KeepCapture与ReleaseCapture命令的作用就是事先把大门一直开着,直到我取完物品,再关闭。 |
总结:也许我以上墨迹可能许多新同学暂时还无法理解完全,但没关系,你们只要最后知道多点找色比找图高效精确即可。
不啰嗦了,以下直接把目前常用的函数模块发出来,只想有功能用的同学可以 Ctrl C → Ctrl V 完事,想了解具体原理并学习知识的可以细细品读!有描述不当之处可以跟帖留言或各大按键群里给我留言。
(本人联系方式按键各大群)
函数名称:CmpMultiCol 函数功能:固定坐标多点模糊找色 函数参数: 参数1:整数型,屏幕X坐标 参数2:整数型,屏幕Y坐标 参数3:字符串型,第一点16进制颜色值 参数4:字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色) 参数5:整数型,颜色相似度(推荐0.9) 返回值:True 或 False(符合或不符合,坐标保存在intX与intY) 注意事项:由于需要对一张图像中做大量的信息对比来匹配出屏幕范围中是否有需要的多点特征,所以这里提示必须调用开头加入KeepCapture命令,结束时ReleaseCapture释放掉。
调用范例:如果需要对一张图像做多次图色判断可以用这种调用方式拆开使用,节省资源。
代码语言:javascript复制'加载当前屏幕画面信息
KeepCapture
'调用多点找色命令,判断该特征是否存在区域范围中
If CmpMultiCol(10,10,"FFFFFF","1|5|FFFFFF,5|10|FFFFFF",0.9)=True Then
'说明找到
TracePrint "找到,第一个点坐标:" & IntX & "," & IntY
Else
'否则
TracePrint "没有找到"
End If
'释放上次画面加载信息,以免对干扰后面找色命令
ReleaseCapture
复制代码
函数模块:
代码语言:javascript复制'固定坐标多点模糊找色
Function CmpMultiCol(x,y,col,str,n)
CmpMultiCol=False
IntX=x
IntY=y
If CmpCol(x,y,col,n)=True Then
'第一个点颜色符合,调用MultiColor多点处理模块匹配其余点的颜色是否正确
CmpMultiCol=MultiColor(x,y,str,n)
Else
'第一个点颜色不符,调用FindMultiCol多点找色模块,对该点再次进行一次小范围多点找色查找
CmpMultiCol=FindMultiCol(x-3,y-3,x 3,y 3,col,str,n)
End If
End Function
复制代码
原理解析:待编辑
函数名称:FindMultiCol 函数功能:区域范围多点找色 函数参数: 参数1:整数型,屏幕左上角X坐标 参数2:整数型,屏幕左上角Y坐标 参数3:整数型,屏幕右下角X坐标 参数4:整数型,屏幕右下角Y坐标 参数5:字符串型,第一点16进制颜色值 参数6:字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色) 参数7:整数型,颜色相似度(推荐0.9) 返回值:True 或 False(符合或不符合,坐标保存在intX与intY) 注意事项:由于需要对一张图像中做大量的信息对比来匹配出屏幕范围中是否有需要的多点特征,所以这里提示必须调用开头加入KeepCapture命令,结束时ReleaseCapture释放掉。
调用范例:如果需要对一张图像做多次图色判断可以用这种调用方式拆开使用,节省资源。
代码语言:javascript复制'加载当前屏幕画面信息
KeepCapture
'调用多点找色命令,判断该特征是否存在区域范围中
If FindMultiCol(0,0,720,1280,"FFFFFF","1|5|FFFFFF,5|10|FFFFFF",0.9)=True Then
'说明找到
TracePrint "找到,第一个点坐标:" & IntX & "," & IntY
Else
'否则
TracePrint "没有找到"
End If
'释放上次画面加载信息
ReleaseCapture
复制代码
函数模块:
代码语言:javascript复制'区域范围多点模糊找色
Function FindMultiCol(x1,y1,x2,y2,col,str,n)
FindMultiCol=False
Dim x,y
Do
FindColor x1,y1,x2,y2,col,0,n,intX, intY
If intX >= 0 Then
If MultiColor(intX,intY,str,n)=True Then
FindMultiCol=True
Exit Do
Else
x=IntX
y=IntY
Do Until x > x2
FindColor x,y,x2,y,col,0,n,intX,intY
If intX >= 0 Then
If MultiColor(intX,intY,str,n)=True Then
FindMultiCol=True
Exit Function
Else
x=IntX 1
End If
Else
Exit Do
End If
Loop
y1=y 1
End If
Else
Exit Do
End If
Loop Until y1 > y2
End Function
复制代码
原理解析:待编辑
函数名称:MultiColor 函数功能:处理多点点阵匹配,配合多点找色函数模块使用 函数参数: 参数1:整数型,起点X坐标 参数2:整数型,起点Y坐标 参数3:字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色) 参数4:整数型,颜色相似度(推荐0.9) 返回值:True 或 False(符合或不符合,坐标保存在intX与intY)
函数模块:
代码语言:javascript复制Function MultiColor(x,y,str,n)
MultiColor=False
Dim arr1,i,arr2()
arr1=Split(str,",")
For Each i In arr1
arr2=Split(i,"|")
If CmpCol(x Int(arr2(0)),y Int(arr2(1)),arr2(2),n)=False Then
Exit Function
End If
Next
MultiColor=True
End Function
复制代码
原理解析:待编辑
以下部分是基于以上函数模块,进行优化组合,请大家理解后根据需求使用,也可自行组合以上几个模块使用。
函数名称:Cm 函数功能:固定坐标多点找色 函数参数: 参数1:整数型,屏幕X坐标 参数2:整数型,屏幕Y坐标 参数3:字符串型,第一点16进制颜色值 参数4:字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色) 返回值:True 或 False(符合或不符合,坐标保存在intX与intY) 函数模块:
代码语言:javascript复制Function Cm(x,y,col,str)
Cm=CmEx(x,y,col,str,0.9)
End Function
复制代码
原理解析:待编辑
函数名称:CmEx 函数功能:固定坐标多点找色 函数参数: 参数1:整数型,屏幕X坐标 参数2:整数型,屏幕Y坐标 参数3:字符串型,第一点16进制颜色值 参数4:字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色) 参数5:整数型,颜色相似度(推荐0.9) 返回值:True 或 False(符合或不符合,坐标保存在intX与intY)
函数模块:
代码语言:javascript复制Function CmEx(x,y,col,str,n)
KeepCapture
CmEx=CmpMultiCol(x,y,col,str,n)
ReleaseCapture
End Function
复制代码
原理解析:待编辑
函数名称:Fm 函数功能:区域范围多点找色 函数参数: 参数1:整数型,屏幕左上角X坐标 参数2:整数型,屏幕左上角Y坐标 参数3:整数型,屏幕右下角X坐标 参数4:整数型,屏幕右下角Y坐标 参数5:字符串型,第一点16进制颜色值 参数6:字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色) 返回值:True 或 False(符合或不符合,坐标保存在intX与intY)
函数模块:
代码语言:javascript复制Function Fm(x1,y1,x2,y2,col,str)
Fm=FmEx(x1,y1,x2,y2,col,str,0.9)
End Function
复制代码
原理解析:待编辑……
函数名称:FmEx 函数功能:区域范围多点找色(模糊百分比) 函数参数: 参数1:整数型,屏幕左上角X坐标 参数2:整数型,屏幕左上角Y坐标 参数3:整数型,屏幕右下角X坐标 参数4:整数型,屏幕右下角Y坐标 参数5:字符串型,第一点16进制颜色值 参数6:字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色) 参数7:整数型,颜色相似度(推荐0.9) 返回值:True 或 False(符合或不符合,坐标保存在intX与intY)
函数模块:
代码语言:javascript复制Function FmEx(x1,y1,x2,y2,col,str,n)
KeepCapture
FmEx=FindMultiCol(x1,y1,x2,y2,col,str,n)
ReleaseCapture
End Function
复制代码
原理解析:待编辑……
待续…… 20140519 修正:FindMultiCol函数模块中的一个逻辑错误,解决特别情况下会进入死循环的问题。 20140530 修改:三个函数名称与新版(1.5)新增命令重名问题。
原来名称 | 修改名称 |
---|---|
CmpColor | CmpCol |
CmpMultiColor | CmpMultiCol |
FindMultiColor | FindMultiCol |
20140603 修正:CmpCol函数中坐标判断,避免多点找色偏移坐标为负数时,出现错误卡住