Google Chrome Dino Bot 使用图像识别 | Python
没有互联网连接时,您会在 Chrome 浏览器中看到什么?是的,每个人都知道屏幕上出现的恐龙游戏。因此,在本文中,我们将构建一个无需用户交互即可玩 Chrome Dino 游戏的简单Python机器人。在这里,我们没有使用任何机器学习或人工智能来解决这个问题,但我们将使用简单的图像/屏幕处理。
我们将使用 Pyautogui 和 PIL (Python Imaging Library) 来实现。这个项目非常基础,只有大约 50 行代码,但它的结果会让你大吃一惊。
使用的一些库是:
- PIL : Python Imaging Library (PIL) 是Python编程语言的免费库,增加了对打开、操作和保存许多不同图像文件格式的支持。
- Pyautogui: PyAutoGUI 是一个Python模块,用于以编程方式控制鼠标和键盘,无需任何用户交互。
- Time : Python “时间”模块,它允许我们处理有关时间、其转换和表示的各种操作,这些操作在生活中的各种应用程序中都有使用。
- Numpy : NumPy 是Python编程语言的库,增加了对大型多维数组和矩阵的支持,以及对这些数组进行操作的大量高级数学函数。
算法 -
- 使用“replaybutton”坐标使用 Pyautogui 库单击重新启动按钮。
- 计算出现在 Dinosaur 前面的框中的所有白色像素值的总和。
- 如果方框中任何时候出现的像素值总和小于白色像素值的总和,则意味着“灌木”或“鸟”即将到来。所以我们要么让我们的 Dino 跳,要么弯下腰。
- 为了保护迪诺免受“布什”的伤害,我们进行了一次跳跃。
- 为了保护 Dino 免受“鸟”的伤害,我们始终保持 Dino 的安全。
下面是Python的实现——
Python3
# importing above defined libraries to
# implement the functionalities
from PIL import ImageGrab, ImageOps
import pyautogui
import time
import numpy as np
class coordinates():
# coordinates of replay button to start the game
replaybutton =(360, 214)
# this coordinates represent the top-right coordinates
# that will be used to define the front box
dinasaur = (149, 239 )
def restartGame():
# using pyautogui library, we are clicking on the
# replay button without any user interaction
pyautogui.click(coordinates.replaybutton)
# we will keep our Bot always down that
# will prevent him to get hit by bird
pyautogui.keyDown('down')
def press_space():
# releasing the Down Key
pyautogui.keyUp('down')
# pressing Space to overcome Bush
pyautogui.keyDown('space')
# so that Space Key will be recognized easily
time.sleep(0.05)
# printing the "Jump" statement on the
# terminal to see the current output
print("jump")
time.sleep(0.10)
# releasing the Space Key
pyautogui.keyUp('space')
# again pressing the Down Key to keep my Bot always down
pyautogui.keyDown('down')
def imageGrab():
# defining the coordinates of box in front of dinosaur
box = (coordinates.dinasaur[0]+30, coordinates.dinasaur[1],
coordinates.dinasaur[0]+120, coordinates.dinasaur[1]+2)
# grabbing all the pixels values in form of RGB tuples
image = ImageGrab.grab(box)
# converting RGB to Grayscale to
# make processing easy and result faster
grayImage = ImageOps.grayscale(image)
# using numpy to get sum of all grayscale pixels
a = np.array(grayImage.getcolors())
# returning the sum
print(a.sum())
return a.sum()
# function to restart the game
restartGame()
while True:
# 435 is the sum of white pixels values of box.
# You may get different value is you are taking bigger
# or smaller box than the box taken in this article.
# if value returned by "imageGrab" function is not equal to 435,
# it means either bird or bush is coming towards dinosaur
if(imageGrab()!= 435):
press_space()
# time to recognize the operation performed by above function
time.sleep(0.1)
输出 :
改进:一段时间后,Dino Bot Game 变得很快。鸟儿和灌木丛开始飞得很快。所以我们不是让我们的机器人去学习所有这些东西,而是根据过去的学习来改变它的速度。所以我们的机器人将在 2000 分左右函数。为了得分更高,我们必须应用机器学习和人工智能。