如何实现屏幕文本变化持续监测,提取游戏护盾、生命值等实时数值
游戏屏幕血条状态持续监测实现方案
需求梳理
你需要实现固定位置的血条状态识别、持续监测、按次输出状态记录,对应两种血条状态的识别结果如下:
- 满血满盾状态:

输出内容:Shield: 100
Health: 100 - 护盾剩余82状态:

输出内容:Shield: 82
Health: 100
最终要输出连续的状态记录,示例效果:
Shield: 100
Health: 100
Shield: 100
Health: 100
Shield: 100
Health: 99
实现步骤
1. 固定区域屏幕截取
首先定位游戏血条在屏幕上的固定坐标范围(左上角x、y,宽w、高h),每次仅截取该区域画面,降低性能消耗。推荐用mss库实现高速截图,示例代码:
import mss import numpy as np # 替换为你实测的血条区域坐标 monitor = {"top": 100, "left": 100, "width": 200, "height": 50} with mss.mss() as sct: # 截取指定区域,转为numpy数组供后续处理 img = np.array(sct.grab(monitor))
依赖安装命令:pip install mss numpy
2. 血条数值识别
优先用进度条像素占比计算,准确率和速度远高于OCR:
- 提前确定护盾条、血量条在截取区域内的y轴范围,以及各自的总长度(像素值)
- 提取护盾/血量条所在的行像素,统计填充色(比如蓝色是护盾、红色是血量)的像素数量
- 数值=(填充像素数/总长度)* 满值(通常为100),四舍五入取整即可
如果血条是直接显示数字的形式,用OCR识别即可,需要先对截图做预处理提升准确率:
import cv2 # 灰度化处理 gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY) # 二值化处理,阈值根据实际画面亮度调整 _, binary = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV)
OCR相关依赖安装命令:pip install opencv-python pytesseract easyocr
3. 状态记录与输出
维护上一次的状态值,每次识别完成后按要求输出,也可以写入本地文件持久化存储:
import time last_shield = 100 last_health = 100 # 采样间隔,单位秒,可根据需求自行调整 interval = 1 while True: # 此处替换为你自己实现的截图、数值识别逻辑 current_shield = get_shield_value(img) current_health = get_health_value(img) # 全量输出每次的状态 print(f"Shield: {current_shield}") print(f"Health: {current_health}") # 可选:仅数值变化时输出,减少冗余记录 # if current_shield != last_shield or current_health != last_health: # print(f"Shield: {current_shield}") # print(f"Health: {current_health}") # last_shield = current_shield # last_health = current_health time.sleep(interval)
优化建议
- 调整合适的采样频率,普通场景1秒1次足够,既不会漏状态也不会占用过多CPU
- 如果游戏有反作弊机制,建议用硬件采集卡外接设备的方案实现截图,避免触发游戏检测
- 识别前固定血条区域的坐标,不要每次全屏搜索,能大幅提升运行效率
内容的提问来源于stack exchange,提问作者user15966297
相关产品推荐
相关产品推荐

