背景
玩过古剑的小伙伴应该都知道钓鱼时个耗时又无聊的东西
今天教大家如何写个自动钓鱼脚本
ps:成功率大约在80%
ps:本文不提供任何可执行脚本
准备
- 使用python
- 三个lib:
- numpy,
- PIL,
- pywinio
目标
a-未到达目标区域时 b-到达目标区域时首先我们的目标是能够识别出钓鱼时上面的两种状态,
- 指针到达了黄色的指定区域
- 指针没有到达黄色的指定区域
如果到达了就按下Q键,没有到达的话等待
分析图片
- 这是一张矩形图片
- 图片的主要部分是一个蓝色的圆盘(需提取)
- 在圆盘的外部有些没有用的干扰背景(需剔除)
- 黄色扇区的目标区域(需提取)
- 黄色的指针(需提取)
- 指针和目标区域是否重叠(需判断)
实现
0.准备
截图
from PIL import ImageGrab
snapshot = ImageGrab.grab()
按键
- pywinio
- 大漠插件
- 按键精灵
以上3种方式均可,大漠插件只支持32位的python,当然大漠也可以截图
1. 提取蓝色圆盘
#圆盘的颜色
img = Image.open(<Image_file_name>)
default_color = np.array([90, 163, 192], dtype="uint8")
img = np.abs(np.array(img).astype(int) - default_color)
效果:
2. 提取黄色的目标区域和转钩,并转化成黑白图片
def to_gray(img):
y = np.array(img).astype(int) - np.array([33, 78, 158])
y = np.mean(y, axis=2)
y = ((y - np.mean(y)) / (np.max(y) - np.min(y)))
y = y > 0.1
return y * 255
img = to_gray(img)
效果
image.png
3. 屏蔽背景干扰
首先画个园
white_elipse = Image.new(size=img.size,mode="L",color=(0))
draw = ImageDraw.Draw(white_elipse)
draw.ellipse((0,0,white_elipse.width,white_elipse.height),fill=(255))
white_elipse
image.png
然后直接点乘即可
img = (np.array(white_elipse)>128) * img
然后在看看如果转钩到达了目标区域是的状态
image.png4. 检测判断
仔细观察上图,
- 可以发现当转钩到达目标区域时白色减少,黑色增多了
- 减少的白色的总面积恰好是转钩所占据的面积
所以只需简单判断:
- 这一刻的白色面积 - 上一刻白色面积 > 转钩掉面积
就可以判断是否到达了目标区域
白色区域面积计算:
def area(img):
return np.count_nonzero(img) / np.size(img)
zuang_gou_area = 0.004 #转钩掉面积
网友评论