実機におけるパネポンAI 盤面認識パート

AIの方針

まず動くことを目指す。
そのため連鎖は考えず、3つ消し・4つ消しをひたすら行う。

盤面認識

まず盤面を把握したい。
盤面はゆっくりとせりあがってくるため、パネルを切り出して判定するのは難しい。
よってパターンマッチングで盤面取得を目指す。
f:id:Ord:20160619012016p:plain
このような盤面に対して、各色のチップをテンプレートとしてパターンマッチングを行った。

CHIPS = {"R":1, "S":2, "G":3, "Y":4, "V":5}
board = [[0 for c in xrange(6)] for l in xrange(12)]

rate_comp = 2
temp_x = 35 / rate_comp
temp_y = 35 / rate_comp

threshold = 0.97
img = cv2.resize(clp, (WINDOW_SIZE_X/rate_comp, WINDOW_SIZE_Y/rate_comp), interpolation=cv2.cv.CV_INTER_NN)
for panel in CHIPS.keys():
    p = cv2.imread("panels/"+panel+"_cut.png")
    p = cv2.resize(p, (temp_x, temp_y), interpolation=cv2.cv.CV_INTER_NN)
    matches = cv2.matchTemplate(p, img, cv2.cv.CV_TM_CCORR_NORMED)
    for y in xrange(matches.shape[0]):
        for x in xrange(matches.shape[1]):
            if matches[y][x] > threshold:
                board[y/(CHIP_Y/rate_comp)][x/(CHIP_X/rate_comp)] = CHIPS[panel]
            

判定ののち、再現した盤面は以下のようになった。
f:id:Ord:20160619012020p:plain
うまくいっている。
しかし、場合によっては背景を誤検知することがあるため、要調整である。

問題点

遅い。

cv2.matchTemplate()

に一回当たり0.01秒程度かかっているので、高速化したいところ。
rate_compを適宜いじってうまくやりたいところだが、上げすぎると認識抜けが発生するため調整が難しい。

今後

とりあえずモチベーションのためにも、盤面判定はひとまず置いてAI本体の実装にかかる。