実機におけるパネポンAI 盤面認識パート
パネルでポンとは
Wikipedia参照のこと。
パネルでポン - Wikipedia
AIの方針
まず動くことを目指す。
そのため連鎖は考えず、3つ消し・4つ消しをひたすら行う。
盤面認識
まず盤面を把握したい。
盤面はゆっくりとせりあがってくるため、パネルを切り出して判定するのは難しい。
よってパターンマッチングで盤面取得を目指す。
このような盤面に対して、各色のチップをテンプレートとしてパターンマッチングを行った。
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]
判定ののち、再現した盤面は以下のようになった。
うまくいっている。
しかし、場合によっては背景を誤検知することがあるため、要調整である。
問題点
遅い。
cv2.matchTemplate()
に一回当たり0.01秒程度かかっているので、高速化したいところ。
rate_compを適宜いじってうまくやりたいところだが、上げすぎると認識抜けが発生するため調整が難しい。
今後
とりあえずモチベーションのためにも、盤面判定はひとまず置いてAI本体の実装にかかる。