単純なゲームChrome Dynoからイメージ上のオブジェクトを検出する必要があります。私はPythonとSeleniumを使ってゲームを始め、Canvas Imageを読み込んでいます。メインのタク、この画像上のオブジェクトを検出し、DynoとDynoのバリアを見つけます。Python - オブジェクト上のオブジェクトを解決する
私はOpenCVの、cv2
ライブラリを使用して画面上のすべてのオブジェクトを解析するために、このコードを使用しています。 このコード(2つの主な機能)の下には、すべてのオブジェクトを認識するために約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
`
私の目標は、他のスクリプトのためのゲームがプレイ可能にするために、それは可能な限り、この時間を短縮です。 BTW私はIAMDinosaurプロジェクトにインスピレーションを与えました.JSとRobot JSを使って、この作業はかなりうまくいっていました。
あなたのマシンにGPUがある場合、OpenCVを使ってCuda/OpenCLを使うのが簡単です。 – zindarod
@ Zindarod私はすべての提案を公開しており、後ほどOpenCLでこれをチェックするかもしれません。私はオブジェクトの認識中に時間を節約するために、ゲームを一時停止することを考えています(ウィンドウを有効/無効にする)。 – GensaGames
私は数ヶ月前に同様のプロジェクトを行っていましたが、opencvの助けを借りてPyautoguiを使ってtrexボットをプレイしました。プログラムは約500点を獲得することができますが、スクリーンショットの技術が遅いため、ボットが死亡します。ここにレポがあります。https://github.com/arsho/t_rex_bot – arsho