Pythonプログラムでスクリーンショットの取得とマウス操作ができるようになったので
なんか面白いことやってみよう!!
ってことでマインスイーパ攻略プログラムを作ってみることにしました.
今回はマスの数字の認識が目標です.
戦略としては
1.スクリーンショットを取得
2.マインスイーパ画面を探す(下の画像でマッチング)
3.それぞれのマスに対して数字を調べる(下のテンプレート画像からよくマッチするものを探す)
4.全部まとめると全体がわかる
という感じでコードを書きました.
注目の結果は...
こんな感じ!
完璧ですね!
という訳で次はマインスイーパを解くアルゴリズムを作っていきたいと思います.
ソースコードはここからダウンロードできます
なんか面白いことやってみよう!!
ってことでマインスイーパ攻略プログラムを作ってみることにしました.
今回はマスの数字の認識が目標です.
戦略としては
1.スクリーンショットを取得
2.マインスイーパ画面を探す(下の画像でマッチング)
3.それぞれのマスに対して数字を調べる(下のテンプレート画像からよくマッチするものを探す)
4.全部まとめると全体がわかる
という感じでコードを書きました.
注目の結果は...
こんな感じ!
完璧ですね!
という訳で次はマインスイーパを解くアルゴリズムを作っていきたいと思います.
ソースコードはここからダウンロードできます
#-*- coding: utf-8 -*- import gtk,cv import time import os width,height=1920,1200 #width,height=500,500 x,y=0,0 class Taiping: def __init__(self): self.capture() def capture(self): self.pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height) self.pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(), gtk.gdk.colormap_get_system(), x, y, 0, 0, width, height) self.step=self.pixbuf.get_rowstride() self.cv_im = cv.CreateImageHeader((width,height),cv.IPL_DEPTH_8U,3) cv.SetData(self.cv_im, self.pixbuf.get_pixels(), self.step) cv.CvtColor(self.cv_im,self.cv_im,cv.CV_BGR2RGB) def match_title(self): self.capture() self.templateTitle = cv.LoadImage("title.png",cv.CV_LOAD_IMAGE_COLOR) self.matchTitle = cv.CreateImage((self.cv_im.width-self.templateTitle.width+1,self.cv_im.height-self.templateTitle.height+1),32,1) cv.MatchTemplate(self.cv_im,self.templateTitle,self.matchTitle,cv.CV_TM_CCOEFF_NORMED) loc = cv.MinMaxLoc(self.matchTitle) if loc[1] > 0.5 : #os.system("xte 'mousemove " + str(loc[3][0] + self.template.width/2) + " " + str(loc[3][1] + self.template.height/2) + "'") self.mine_x = loc[3][0] - 66 self.mine_y = loc[3][1] + 100 # print("xte 'mousemove " + str(loc[3][0] + self.templateTitle.width/2) + " " + str(loc[3][1] + self.templateTitle.height/2) + "'") self.sub = cv.GetSubRect(self.cv_im, (self.mine_x,self.mine_y, 485, 485)) cv.ShowImage("result", self.sub) def load_image(self): self.cell_x_num = 16 self.cell_y_num = 16 self.cell_size = 30 self.template = [cv.LoadImage("0.png",cv.CV_LOAD_IMAGE_COLOR), cv.LoadImage("1.png",cv.CV_LOAD_IMAGE_COLOR), cv.LoadImage("2.png",cv.CV_LOAD_IMAGE_COLOR)] self.match = [ cv.CreateImage((self.cell_size-templ.width+1,self.cell_size-templ.height+1),32,1) for templ in self.template] def match_cell(self,i,j): self.cell = cv.GetSubRect(self.sub, (i*30,j*30, 30, 30)) for index,(temple,match) in enumerate(zip(self.template,self.match)): cv.MatchTemplate(self.cell,temple,match,cv.CV_TM_CCOEFF_NORMED) loc = cv.MinMaxLoc(match) if loc[1] > 0.7 : #os.system("xte 'mousemove " + str(loc[3][0] + self.template.width/2) + " " + str(loc[3][1] + self.template.height/2) + "'") #print(loc[1]) #print(str(index) + str(i) + "," + str(j)) #cv.ShowImage("test",self.cell) #cv.WaitKey() return index return "*" #print("xte 'mousemove " + str(loc[3][0] + self.template.width/2) + " " + str(loc[3][1] + self.template.height/2) + "'") #cv.ShowImage("a",self.cell) #cv.WaitKey(0) def main(self): self.load_image() self.match_title() #self.match_first() while True: for j in range(self.cell_y_num): for i in range(self.cell_x_num): print self.match_cell(i,j), print "" cv.WaitKey(0) break if __name__ == '__main__': taip = Taiping() taip.main()
PR
COMMENT
カレンダー
最新記事
(01/19)
(12/08)
(11/29)
(11/08)
(11/04)
プロフィール
HN:
たるこす
性別:
男性
ブログ内検索
カウンター