勤能补拙,Expter

成都游戏Coder,记录游戏开发过程的笔记和心得!

关于QQ找茬的辅助工具的实现

        最近看朋友玩QQ找茬( QQ找茬主要是比较2张图片的不同之处,然后双击即可 ) 我也去玩了把,结果高手如云,沦为近视眼(等级)打算写个程序让程序自动去识别,自动去点击鼠标。

       实现方法很简单,先得到2张需要比较的图片(可以通过QQ找茬窗口句柄,得到当前HITMAP,然后得到其像素点),建立一个一张表的数组,然后比较其对应像素点的值是否相同,不同为1,相同为0.
       这样就可以在内存中得到不同的区域,但这个区域是离心的,也就是不完全对,必须对其进行处理,可以通过对这些数组值为1的点进行腐蚀(关于腐蚀算法主要让一些区域膨胀一圈)
      其中腐蚀算法:
 Z中的集合ABBA进行腐蚀的整个过程如下: 
      是以得到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秒左右的时间。

posted on 2009-07-12 22:45 expter 阅读(282) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理