忍者ブログ
[7]  [6]  [5]  [4]  [3]  [1
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Pythonプログラムでスクリーンショットの取得とマウス操作ができるようになったので
なんか面白いことやってみよう!!

ってことでマインスイーパ攻略プログラムを作ってみることにしました.





今回はマスの数字の認識が目標です.

戦略としては
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
back
COMMENT
name
title
text
color   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
mail
URL
pass
secret
PREV ←  HOME  → NEXT
カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
プロフィール
HN:
たるこす
性別:
男性
バーコード
ブログ内検索
コガネモチ
カウンター
Copyright (C) 2024 たるこすぶろぐ All Rights Reserved.

Photo by (c)Tomo.Yun   TemplateDesign by kaie
忍者ブログ [PR]