大家好,我是公众号3分钟学堂的郭立员~
平时找图的时候会遇到这种情况,明明两张图看着一样,但是找图命令就是找不到,然后我们就会修改相似度或者偏色,但是发现依然找不到。
这是什么原因呢?
找图命令的原理是要求每一个像素点的颜色值都相同(相近),这里重点是“每一个像素点”,这个要求非常严苛。
即使是100个像素有99个相同,也会找图识别,可能有人谁说,修改相似度就行了,其实相似度是针对颜色值的相似,而不是像素格式的相似。
那么有没有针对像素个数相似的方法呢?
我想到的方法是遍历所有颜色点进行比色,比色成功的记录一下,然后把所有成功的数量和总的颜色点比较一下,看看相差不大,就是像素个数相近了。
举个例子,看下面这种图,要找图中两个相同内容。
图片放大15倍进行比对查看:
看起来很像的两个图片,放大后发现很多颜色点是不一样的,这也是为什么我们找图找不到的原因。
了解我们要做什么,下面开始说说实习原理:
①我们要知道找图的截图颜色信息,包括图片的尺寸和每个像素点的颜色值。
②提取出左上角第一个点的颜色值(333995)
③在屏幕上找到颜色值(333995)的所有点,每个符合要求的点都往后比对一个图片大小位置的所有颜色值。
会有很多点是颜色值(333995),并不都是我们想要查找的位置。
④为了排查不符合要求的,我们需要在图片大小区域内进行逐个像素比对,每比对成功一个像素,就记录+1,所有像素点都比对完后,和区域总像素点数量比较,看成功数量的占比。
如果比例比较高,就认为是符合要求的点,把这个点的位置输出作为“找图”的返回坐标。
原理就是这样的,不过我在写代码的时候感觉有很多要注意的细节。
下面看看我的测试代码,此代码仅供学习,如果纰漏的地方自行完善。
- Import "cjson.lua"
- Dim Path = "/sdcard/$MuMu共享文件夹/1.png"
- Dim PixelData =Image.GetPicData(Path)
- Dim col=UCase(Hex(RGB(PixelData[1][1][3],PixelData[1][1][2],PixelData[1][1][1])))
- TracePrint col
- Dim pic_x=Len(PixelData)
- Dim pic_y=Len(PixelData[1])
- Dim x=GetScreenX()
- Dim y=GetScreenY()
- Dim 颜色数量
- 颜色数量 = GetColorNum(0,0,x,y,col&"-050505",0.95)
- TracePrint "找到的颜色数量有" & 颜色数量 & "个"
- KeepCapture
- For n = 1 To y
- For m = 1 To x
- If CmpColor(m, n, col&"-050505", 0.95) = 0 Then
-
- Dim s=0
- For j = 1 To pic_y
- For i = 1 To pic_x
- Dim cor=UCase(Hex(RGB(PixelData[i][j][3],PixelData[i][j][2],PixelData[i][j][1])))
- If CmpColor(m+i-1, n+j-1, cor&"-050505",0.9)=0 Then
- s=s+1
- End If
- Next
- Next
-
- If s > cint((pic_x*pic_y)/2) Then
- TracePrint "---------------------------"
- TracePrint "坐标:",m,n
- TracePrint "相似程度:",s*100/(pic_x*pic_y),"%"
- TracePrint "满足条件"
- End If
- End If
- Next
- Next
- ReleaseCapture
复制代码测试结果中,把相似程度高于50%的提取出来了。
说说优缺点吧:
优点:能把相似的图找出来
缺点:找图速度极慢,参数需要精细设置
=正文完=