Dead By Daylight血网AIR Bot为何无法识别正确颜色?
问题分析与解决思路
你遇到的颜色识别偏差问题,主要源于以下几个核心原因:
1. 绝对颜色匹配的局限性
游戏里的「白色」元素(比如血网可点击节点)几乎不会是绝对RGB(255,255,255)——抗锯齿效果、屏幕gamma校正、游戏内光影渲染都会让实际像素颜色和理想纯白产生细微偏差。用严格的r == 255 and g == 255 and b == 255判断,要么会漏掉真正的目标,要么会因为截图采样误差,误把接近纯白的浅灰、淡色像素当成纯白。
2. 截图颜色模式的干扰
pyautogui.screenshot()返回的图像可能带有Alpha通道(RGBA模式),直接提取r,g,b时,可能会把Alpha通道值错误解析为颜色通道值,导致颜色判断完全偏离预期。
3. 采样步长的精度问题
你用range(0,width,10)和range(0,height,10)跳步采样,虽然提升了效率,但容易跳过真正的纯白像素,反而采样到目标边缘的过渡色(比如抗锯齿区域),进而误判为目标。
修正后的代码
from pyautogui import * import pyautogui import time import keyboard import win32api, win32con time.sleep(2) def click(x,y): win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) time.sleep(1.3) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) while not keyboard.is_pressed('q'): # 强制转换为RGB模式,消除Alpha通道干扰 pic = pyautogui.screenshot(region=(250,200,750,750)).convert('RGB') width, height = pic.size target_found = False # 标记已找到目标,避免单次截图内重复点击 for x in range(0, width, 5): # 缩小步长,提升采样精度 if target_found: break for y in range(0, height, 5): r,g,b = pic.getpixel((x,y)) # 设置颜色容差,匹配游戏中实际的"白色"像素 if r >= 245 and g >= 245 and b >= 245: click(x+250, y+200) time.sleep(0.5) # 延长等待,避免操作冲突 target_found = True break
关键修改说明
- 强制RGB模式:通过
convert('RGB')确保截图无Alpha通道,避免颜色解析错误。 - 颜色容差判断:将严格匹配改为阈值判断,你可以根据实际截图调整245这个数值(建议在240-250区间测试),适配游戏内真实的白色像素。
- 添加目标标记:用
target_found变量在找到目标后直接跳出所有循环,避免单次截图内重复点击。 - 缩小采样步长:把步长从10改为5,提升采样精度,减少漏判或误判概率。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

