这个项目实现了一个基于OpenCV特征匹配的Chrome恐龙游戏自动控制机器人。当Chrome浏览器检测到网络断开时,会显示一个简单的恐龙跳跃游戏(俗称"小恐龙游戏")。这个项目通过计算机视觉技术自动识别游戏中的障碍物,并控制恐龙跳跃避开它们。
我最初看到这个项目时,觉得它完美结合了计算机视觉和游戏自动化两个有趣的领域。作为一个经常在断网时玩这个小游戏的开发者,自动化的想法让我很兴奋。经过几天的开发和调试,最终实现了一个稳定运行、准确率超过95%的机器人。
OpenCV的特征匹配算法是这个项目的核心。相比简单的颜色识别或模板匹配,特征匹配有以下优势:
我测试了SIFT、SURF和ORB三种特征提取算法,最终选择了ORB,因为它在保持较好准确率的同时速度最快,完全能满足实时游戏的需求。
整个系统的工作流程如下:
python复制# 伪代码展示核心流程
while True:
frame = capture_screen()
features = extract_orb_features(frame)
obstacles = match_features(features, obstacle_templates)
if detect_obstacle(obstacles):
press_space()
首先需要准确定位游戏窗口的位置。我采用了以下方法:
python复制def locate_game_region():
screenshot = pyautogui.screenshot()
# 搜索分数数字的特征点
score_template = cv2.imread('score_template.png', 0)
# 使用特征匹配找到分数显示位置
# 根据分数位置计算游戏区域坐标
return game_region
障碍物主要有三种:仙人掌、飞鸟和夜间模式的蝙蝠。我为每种障碍物准备了多个角度的样本图像,提取并保存它们的特征描述符。
python复制# 预处理障碍物模板
obstacle_templates = []
for img_path in ['cactus1.png', 'cactus2.png', 'bird.png']:
img = cv2.imread(img_path, 0)
# 检测ORB特征点和描述符
kp, des = orb.detectAndCompute(img, None)
obstacle_templates.append((kp, des))
游戏运行时的核心检测逻辑:
python复制while True:
frame = grab_game_frame()
kp_frame, des_frame = orb.detectAndCompute(frame, None)
# 与所有模板进行特征匹配
for template_kp, template_des in obstacle_templates:
matches = bf.match(des_frame, template_des)
# 根据匹配点数量和距离判断是否有障碍物
if len(matches) > MIN_MATCHES:
# 计算障碍物位置
obstacle_pos = calculate_position(kp_frame, matches)
# 根据位置和速度计算跳跃时机
if need_jump(obstacle_pos):
pyautogui.press('space')
break
经过大量测试,确定了以下最优参数:
为了确保实时性,我采用了生产者-消费者模式:
python复制from queue import Queue
from threading import Thread
frame_queue = Queue(maxsize=1)
def capture_thread():
while True:
frame = grab_frame()
if frame_queue.empty():
frame_queue.put(frame)
Thread(target=capture_thread, daemon=True).start()
问题:有时会将背景元素误认为障碍物,或漏检某些障碍物。
解决方案:
问题:游戏在夜间模式下颜色反转,原有模板可能失效。
解决方案:
问题:游戏速度会随时间增加,需要动态调整检测参数。
解决方案:
这个基础版本已经能稳定运行,但还有不少改进空间:
我在实际开发中发现,特征匹配方法在保持较高准确率的同时,对计算资源的需求相对较低,这也是我最终选择这个方案的主要原因。对于想要进一步优化性能的开发者,可以考虑使用C++重写核心算法,或者尝试OpenCV的CUDA加速功能。