pythonでスマホゲーム自動化~FGO自動化編~
概要
pythonを用いた画像処理を用いてスマホゲームを自動化していきます.
PCを初期化したので,再度設定してきます.
前回の記事
https://qiita.com/m_tani_july/items/6691bc590693c3cf65cb
解説動画
後日,動作確認の動画をアップロードしたいと思います.
動画をアップしました.
コードの紹介
スマホから画像を取得してから,テンプレートマッチングしてその結果を可視化したプログラムです.
def _click_image3_vis(temp_path):
###############################################################
# 画像取得
#
# テンプレート画像の読み込み
temp = cv2.imread(temp_path)
#
# スマホのキャプチャ画像
img = capture_screen_2(device_id)
#
# デバッグ用に一応保存
cv2.imwrite('_screen.png', img)
###############################################################
# デバッグ用
#
# img = cv2.imread('_screen.png')
# temp_path = r'img\fgo\arts.png'
# temp = cv2.imread(temp_path)
# cv2.imwrite('_screen.png', img)
result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED)
# 最も類似度が高い位置を取得する。
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
# print(f"max value: {maxVal}, position: {maxLoc}, temp_path: {temp_path}")
# print("max value:{:6.3f}, position:{:<10}, temp_path:{}".format(maxVal, maxLoc, temp_path))
print("max value:{:6.3f}, position:{:>16}, temp_path:{}".format(maxVal, "{}".format(maxLoc), temp_path))
###############################################################
# 確認用描画セクション
#
# 読み込んだ画像の高さと幅を取得
kenel_size = 201
height = img.shape[0]
width = img.shape[1]
#
# =============================================================
# show resized base image
resized_img = cv2.resize(img,(int(width/2), int(height/2)))
cv2.imshow("image", resized_img)
cv2.moveWindow("image", 0, 0)
#
# =============================================================
# show heat map & roi
#
# create heat map
#
# 0.5 以下は無視
result[result<0.5] = 0
# 3 channel heat_map
heat_map = np.zeros((img.shape[0], img.shape[1], 3))
# result to heatmap
heat_map[0:-temp.shape[0]+1, 0:-temp.shape[1]+1, 2] = result
# heatmap GaussianBlur
heat_map_blur = cv2.GaussianBlur(heat_map,(kenel_size, kenel_size),0)
result2 = heat_map[:, :, 2]
#
# create gray image
resized_img_gray = resized_img.copy()
img_gray = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY) # RGB2〜 でなく BGR2〜 を指定
for i in range(3):
resized_img_gray[:, :, i] = img_gray
# temp image show
cv2.imshow("temp", temp)
cv2.moveWindow("temp", int(resized_img.shape[1]), 0)
# resized heat_map
resized_heat_map = cv2.resize(heat_map_blur,(int(width/2), int(height/2))) * 255
# resized heat_map
xheat = (resized_heat_map *255 * 0.6 + resized_img_gray * 0.4)/255
# detect peak
coordinates = peak_local_max(resized_heat_map[:, :, 2], min_distance=2)
# draw rectangle
color_ = np.array([102, 51, 255])/255 # RGB -> GBR
for p in coordinates:
cv2.rectangle(xheat, (p[1]+int(temp.shape[1]/2), p[0]+int(temp.shape[0]/2)), (p[1], p[0]), color_, thickness=1)
# show heat map
cv2.imshow("heat", xheat)
cv2.moveWindow("heat", 0, int(resized_img.shape[0] + 50))
k = cv2.waitKey(1)
おわりに
今回はadbコマンドと画像処理を組み合わせたコードを紹介しました.
これでオート周回するプログラムができます.
今後は別ゲームへの対応や戦略アルゴリズムの開発をやっていく予定です.
次回
「pythonでスマホゲーム自動化~ファイナルファンタジー ブレイブエクスヴィアス(FFBE)自動化編~」
https://qiita.com/m_tani_july/items/df81ea3a10a70581bb77
Author And Source
この問題について(pythonでスマホゲーム自動化~FGO自動化編~), 我々は、より多くの情報をここで見つけました https://qiita.com/m_tani_july/items/98bddff824cecbf8a395著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .