最近看朋友玩QQ找茬( QQ找茬主要是比較2張圖片的不同之處,然后雙擊即可 ) 我也去玩了把,結(jié)果高手如云,淪為近視眼(等級)打算寫個程序讓程序自動去識別,自動去點擊鼠標。
實現(xiàn)方法很簡單,先得到2張需要比較的圖片(可以通過QQ找茬窗口句柄,得到當前HITMAP,然后得到其像素點),建立一個一張表的數(shù)組,然后比較其對應像素點的值是否相同,不同為1,相同為0.
這樣就可以在內(nèi)存中得到不同的區(qū)域,但這個區(qū)域是離心的,也就是不完全對,必須對其進行處理,可以通過對這些數(shù)組值為1的點進行腐蝕(關于腐蝕算法主要讓一些區(qū)域膨脹一圈)
其中腐蝕算法:
對Z中的集合A和B,B對A進行腐蝕的整個過程如下: 是以得到B的相對與它自身原點的映像并且由z對映像進行移位為基礎的。A被B膨脹是所有位移z的集合,這樣, 和A至少有一個元素是重疊的。我們可以把上式改寫為: 結(jié)構元素B可以看作一個卷積模板,區(qū)別在于膨脹是以集合運算為基礎的,卷積是以算術運算為基礎的,但兩者的處理過程是相似的。
⑴ 用結(jié)構元素B,掃描圖像A的每一個像素
⑵ 用結(jié)構元素與其覆蓋的二值圖像做“與”操作
⑶ 如果都為0,結(jié)果圖像的該像素為0。否則為1
通過腐蝕過后可以基本上得到我們需要找的區(qū)域,然后利用BFS得到其Rect,說明如果用DFS的話可能會出現(xiàn)棧溢出,因為有些區(qū)域太大。
得到Rect后可以SetCursorPos設置鼠標位置(注意 : Rect是相對于窗口句柄, SetCursorPos是設置的位置是相對桌面的坐標),最后可以
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
相應事件。
后記:就是在做這個的時候有時候會出現(xiàn)本來是一個區(qū)域,程序會統(tǒng)計出2個區(qū)域,其實就是在腐蝕算法的時候未處理好,還有一個就是可以通過網(wǎng)絡抓包獲取原始圖片。
因為在預處理的時候,復雜度還是較高,所以在找完一張完整的圖片需要5秒左右的時間。