700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android实现按键找图功能 从零学起之安卓篇《按键精灵安卓版找图找色应用汇总介绍》

android实现按键找图功能 从零学起之安卓篇《按键精灵安卓版找图找色应用汇总介绍》

时间:2021-03-15 01:44:46

相关推荐

android实现按键找图功能 从零学起之安卓篇《按键精灵安卓版找图找色应用汇总介绍》

本帖最后由 兄弟工程师05 于 -6-11 15:09 编辑

本期主题:介绍目前手机按键(按键精灵安卓版)在编写脚本中,都需要用到哪些方式进行图色识别。

惯例先讲好处:

1、找色,如何计算颜色相似度,解决不同款式手机中画面颜色差异的问题。

2、找图,不太推荐,我们来聊聊多点找色,解决找图缓慢不效率,判断不准确的问题。

科普小技巧:关于多点取色如何获取点阵特征(注意手机按键使用,多点找色取点不宜超过10个),请查看以下帖子

正题一:找色,先介绍下手机按键自带的找色命令。

固定坐标获取单点颜色

注解:获取坐标X与Y位置的颜色值信息,返回存入变量col中。

Dim col,x,y

col=GetPixelColor(x,y)

TracePrint "颜色=" & col复制代码区域范围查找单点颜色

注解:变量intX, intY需要预先定义。如果您还没有定义该变量,请取消下面一行的注释。

如果没有找到,intX和intY的值都会被置为-1,那么这里我们只需要判断一个值就可以确认是否找到。

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(符合或不符合)

函数范例:

'判断两个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(符合或不符合)

'固定坐标单点模糊找色

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开始

调用范例:

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, 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释放掉。调用范例:如果需要对一张图像做多次图色判断可以用这种调用方式拆开使用,节省资源。

'加载当前屏幕画面信息

KeepCapture

'调用多点找色命令,判断该特征是否存在区域范围中

If CmpMultiCol(10,10,"FFFFFF","1|5|FFFFFF,5|10|FFFFFF",0.9)=True Then

'说明找到

TracePrint "找到,第一个点坐标:" & IntX & "," & IntY

Else

'否则

TracePrint "没有找到"

End If

'释放上次画面加载信息,以免对干扰后面找色命令

ReleaseCapture复制代码函数模块:

'固定坐标多点模糊找色

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释放掉。调用范例:如果需要对一张图像做多次图色判断可以用这种调用方式拆开使用,节省资源。

'加载当前屏幕画面信息

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复制代码函数模块:

'区域范围多点模糊找色

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)函数模块:

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)

函数模块:

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)函数模块:

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)函数模块:

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)函数模块:

Function FmEx(x1,y1,x2,y2,col,str,n)

KeepCapture

FmEx=FindMultiCol(x1,y1,x2,y2,col,str,n)

ReleaseCapture

End Function复制代码原理解析:待编辑……

待续……

0519

修正:FindMultiCol函数模块中的一个逻辑错误,解决特别情况下会进入死循环的问题。

0530

修改:三个函数名称与新版(1.5)新增命令重名问题。

原来名称修改名称

CmpColorCmpCol

CmpMultiColorCmpMultiCol

FindMultiColorFindMultiCol

0603

修正:CmpCol函数中坐标判断,避免多点找色偏移坐标为负数时,出现错误卡住。

android实现按键找图功能 从零学起之安卓篇《按键精灵安卓版找图找色应用汇总介绍》更新0603 _ 教程中心 - 按键精灵论坛...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。