본문으로 바로가기

예제

 

지난 포스팅에 이어서 매칭된 디노의 width 와 장애물의 width 를 비교해서 간단하게 점프하게 구현해보았습니다.

import os
import cv2
import numpy as np
import pyautogui

tpl = cv2.imread(os.path.join('img', 'dino.png'), cv2.IMREAD_GRAYSCALE)
th, tw = tpl.shape[:2]

ob_names = ['ob1', 'ob2']
ob_list = { k: cv2.imread(os.path.join('img', k + '.png'), cv2.IMREAD_GRAYSCALE) for k in ob_names}
    
cv2.namedWindow('result');
while True:
    screen = pyautogui.screenshot(region=(1800, 50, 700, 500))
    src = np.array(screen)
    src = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY)

    res = cv2.matchTemplate(src, tpl, cv2.TM_CCOEFF_NORMED)
    _, _, _, maxloc = cv2.minMaxLoc(res)

    dino_right_x = maxloc[0] + tw

    dst = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)
    cv2.rectangle(dst, maxloc, (maxloc[0] + tw, maxloc[1] + th), (0, 255, 0), 3)

    for name, ob_tpl in ob_list.items():
        ob_th, ob_tw = ob_tpl.shape[:2]
        res = cv2.matchTemplate(src, ob_tpl, cv2.TM_CCOEFF_NORMED)
        _, _, _, maxloc = cv2.minMaxLoc(res)
        cv2.rectangle(dst, maxloc, (maxloc[0] + ob_tw, maxloc[1] + ob_th), (0, 255, 0), 3)

        if maxloc[0] - dino_right_x <= 150:
            pyautogui.press('space')

    cv2.imshow('result', dst)

    if cv2.waitKey(1) == 27:
        break

cv2.destroyAllWindows()

 

디노의 오른쪽 x좌표

dino_right_x = maxloc[0] + tw

 

장애물들을 종류별로 테스트해보았으나, 매칭 오류율이 높아서 한 개로만 해도 충분할 것 같습니다.

단순히 디노의 오른쪽 x좌표와 장애물의 시작 x좌표를 비교해 어느정도 가까울 경우 점프를 합니다.

ob_names = ['ob1', 'ob2']
ob_list = { k: cv2.imread(os.path.join('img', k + '.png'), cv2.IMREAD_GRAYSCALE) for k in ob_names}

....

for name, ob_tpl in ob_list.items():
    ob_th, ob_tw = ob_tpl.shape[:2]
    res = cv2.matchTemplate(src, ob_tpl, cv2.TM_CCOEFF_NORMED)
    _, _, _, maxloc = cv2.minMaxLoc(res)
    cv2.rectangle(dst, maxloc, (maxloc[0] + ob_tw, maxloc[1] + ob_th), (0, 255, 0), 3)

    if maxloc[0] - dino_right_x <= 150:
        pyautogui.press('space')

 

 

점점 스피드가 빨라지고 새같은 공중 장애물도 있어서 한계가 있습니다.

강화학습을 주제로도 활용할 수 있을지..