我需要從簡單的遊戲Chrome Dyno中檢測圖像上的對象。我使用Python和Selenium開始遊戲,並加載畫布圖像。主要拍打,它檢測這個圖像上的物體,並找到Dyno和Dyno Barriers。Python - 解決圖像上的對象
我使用此代碼,使用OpenCV的,cv2
庫解析畫面上的所有對象。 下面的代碼(兩個主要功能),需要大約80 - 200毫秒(基於障礙大小)來識別所有對象。
`
# Finding only dino object based on Template.
# This might be optimized later with searching by contours
def find_dino__(self, cv2_image):
result = cv2.matchTemplate(cv2_image.astype(np.uint8), self.dino_image, cv2.TM_CCOEFF)
_, _, _, dino_top_left = cv2.minMaxLoc(result)
dino_bottom_right = (dino_top_left[0] + self.dino_width, dino_top_left[1] + self.dino_height)
return GenericGameObject(dino_top_left, dino_bottom_right)
# Find other Barrier Objects, based on position, and except
# that, which behind Dino location. Use Dino position.
def find_dino_barriers__(self, cv2_image, dino_object):
img_fil = cv2.medianBlur(cv2.cvtColor(cv2_image, cv2.COLOR_BGR2GRAY), 13)
img_th = cv2.adaptiveThreshold(img_fil, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
im2, contours, hierarchy = cv2.findContours(img_th, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
objects = []
for i in range(len(contours)):
x, y, w, h = cv2.boundingRect(contours[i])
if y < Settings.DINO_WORKING_Y_AREA[0] \
or y > Settings.DINO_WORKING_Y_AREA[1]:
continue
if x <= dino_object.top_right_point[0]\
and y <= dino_object.top_right_point[1]:
continue
objects.append(GenericGameObject((x, y), (x + w, y + h)))
return objects
`
我的目標,這是縮短這個時間,就像它可能使遊戲可玩的其他腳本。順便說一句,我啓發了IAMDinosaur項目,使用JS和Robot JS這個任務做得非常好。
如果你的機器上有GPU,一個簡單的步驟就是使用OpenCV和Cuda/OpenCL。 – zindarod
@Zindarod我打開了所有的建議,並可能在稍後使用OpenCL進行檢查。我甚至考慮在對象識別期間暫停遊戲(拋出激活/關閉窗口)以節省時間。 – GensaGames
幾個月前我正在做一個類似的項目,在opencv的幫助下使用Pyautogui玩t rex bot。該程序可以獲得500左右的分數,但隨後屏幕截圖技術的緩慢過程導致機器人死亡。這裏是回購,如果它以某種方式幫助你:https://github.com/arsho/t_rex_bot – arsho