动态图要怎么玩
- 您所在的用户组无法下载或查看附件
找图找色作为脚本中用来识别界面元素的主要方式,相信你们一定不陌生,我们可以轻易的使用命令来获取屏幕任何一个位置的BGR颜色信息,并在脚本中自由的选择处理的方式,但有一些情况是我们很难使用BGR颜色去处理的,比如----动态图。
- 您所在的用户组无法下载或查看附件
我们来看这样一个动态图:
- 您所在的用户组无法下载或查看附件
此时我们的需求能够在蓝量剩下大概一半的时候能够识别到并按下相应的回蓝药品。于是我们直接取蓝条正中间的一个点来判定颜色,经过尝试:- 您所在的用户组无法下载或查看附件
每隔50毫秒取蓝条中间一个点的颜色,发现颜色偏差很大,这是由于蓝条里有不断在变化的效果,这种情况如果使用BGR颜色来判定,错误率很高,于是我们需要对这些颜色进行处理,看能否得出他们相似的地方。
这里我们肉眼可以看出,无论这个图片如何变化,蓝色区域总是蓝色,红色区域总是红色,因此,我们可以使用HSV颜色模型来解决这个问题。
什么是HSV?其中H为色调,S为饱和度,V为明度。HSV对用户来说是一种直观的颜色模型,我们刚刚观察出来的颜色是蓝色,也就是色调为蓝色,那么无论他各种变化,只要色调没有变化,我们识别出来的就不会变化。
那么我们来尝试一下,首先是,我们要将BGR转换成HSV,这个我们可以借助百度,很容易就找到算法,我们只要将语法转换成按键的语法就行了,这里我已经写好,直接用吧!
- Do
- TracePrint "BGR: "&GetPixelColor(568,338)
- TracePrint "HSV: "&BGR2HSV(GetPixelColor(568,338))
- TracePrint ""
- Delay 50
- Loop
- Function BGR2HSV(bgrvalue)
- // 补位
- If len(bgrvalue) < 6 Then
- bgrvalue = "000000"
- End If
- // 获取三原色分量
- Dim b = left(right(bgrvalue, 6), 2)
- Dim g = left(right(bgrvalue, 4), 2)
- Dim r = right(bgrvalue, 2)
- r = CLng("0x"&r)
- g = CLng("0x"&g)
- b = CLng("0x"&b)
-
- // 取最大值和最小值
- Dim max = r
- Dim min = r
- If max < g Then
- max = g
- End If
- If max < b Then
- max = b
- End If
- If min > g Then
- min = g
- End If
- If min > b Then
- min = b
- End If
- // 计算 hue
- Dim h
- If r = max Then
- h = (g - b) / (max - min)
- End If
- If g = max Then
- h = 2 + (B - R) / (max - min)
- End If
- If b = max Then
- h = 4 + (R - G) / (max - min)
- End If
- h = h * 60
- If h < 0 Then
- h = h + 360
- End If
- h = Round(h)
- // 计算 saturation
- Dim s = (max - min) / max
- s = s * 100
- s = Round(s)
- // 计算 value
- Dim v = (max / 255) * 100
- v = Round(v)
- // 组合返回
- BGR2HSV = h & "." & s & "." & v
- End Function
复制代码我们直接运行一下:
- 您所在的用户组无法下载或查看附件
相对于BGR这么大的偏差,我们发现HSV中的H,也就是色调,变化及其微小,只需要加上一定的容差,我们就能很准确的识别。
当然,HSV的功能不仅仅如此!相信聪明的你学了之后一定能找出更多的用途!想学习更多吗,请继续关注本系列教程。
- 您所在的用户组无法下载或查看附件