파이썬으로 스마트 폰 게임 자동화 ~ FGO 자동화 편 ~

개요



파이썬을 사용한 이미지 처리를 사용하여 스마트 폰 게임을 자동화합니다.
PC를 초기화했으므로 다시 설정합니다.

마지막 기사
htps : // 이 m/m_타니_주 ly/있어 ms/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 명령과 이미지 처리를 결합한 코드를 소개했습니다.
이것으로 자동 주회하는 프로그램을 할 수 있습니다.

향후는 다른 게임에의 대응이나 전략 알고리즘의 개발을 해 나갈 예정입니다.

다음 번
"파이썬으로 스마트 폰 게임 자동화 ~ 파이널 판타지 브레이브 엑스 비어스 (FFBE) 자동화 편 ~"
htps : // 이 m / m_타니_주 ly / 있고 ms / df81

좋은 웹페이지 즐겨찾기