最近看朋友玩QQ找茬( QQ找茬主要是比较2张图片的不同之处,然后双击即可 ) 我也去玩了把,结果高手如云,沦为近视眼(等级)打算写个程序让程序自动去识别,自动去点击鼠标。
实现方法很简单,先得到2张需要比较的图片(可以通过QQ找茬窗口句柄,得到当前HITMAP,然后得到其像素点),建立一个一张表的数组,然后比较其对应像素点的值是否相同,不同为1,相同为0.
这样就可以在内存中得到不同的区域,但这个区域是离心的,也就是不完全对,必须对其进行处理,可以通过对这些数组值为1的点进行腐蚀(关于腐蚀算法主要让一些区域膨胀一圈)
其中腐蚀算法:
对Z中的集合A和B,B对A进行腐蚀的整个过程如下: 是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。A被B膨胀是所有位移z的集合,这样, 和A至少有一个元素是重叠的。我们可以把上式改写为: 结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素与其覆盖的二值图像做“与”操作
⑶ 如果都为0,结果图像的该像素为0。否则为1
通过腐蚀过后可以基本上得到我们需要找的区域,然后利用BFS得到其Rect,说明如果用DFS的话可能会出现栈溢出,因为有些区域太大。
得到Rect后可以SetCursorPos设置鼠标位置(注意 : Rect是相对于窗口句柄, SetCursorPos是设置的位置是相对桌面的坐标),最后可以
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
相应事件。
后记:就是在做这个的时候有时候会出现本来是一个区域,程序会统计出2个区域,其实就是在腐蚀算法的时候未处理好,还有一个就是可以通过网络抓包获取原始图片。
因为在预处理的时候,复杂度还是较高,所以在找完一张完整的图片需要5秒左右的时间。